【发布时间】:2022-01-13 12:12:51
【问题描述】:
我正在实现一个模板函数,它解析一个字符串并返回一个对象元组,比如
template <typename... Objects>
std::tuple<Objects...> convert2data(const std::string_view& input) {
return std::tuple<Objects...>{ internal::popNext<Objects>(input)... } ;
}
// usage
auto data = convert2data<int, double>("1, 0.01") ;
我将预期类型指定为模板参数。现在我想从命名的元组类型中“直接”获取类型,这对用户来说可能更方便:
using MyData = std::tuple<int, double> ; // included from some header
auto data = convert2data<MyData>("1, 0.01") ;
std::cerr << std::get<int>(data) ;
// or better
MyData data2 = convert2data("1, 0.01") ;
我一直在尝试为这种情况指定专业化,例如这段代码
template <typename... Objects, class std::tuple<Objects...>>
std::tuple<Objects...> convert2data(const std::string_view& input) {
return convert2data<Objects...>(input) ;
}
没有被编译。有没有办法为返回值中使用模板类型的模板函数定义这种特化?
【问题讨论】:
-
我看不出
convert2data("1, 0.01")是如何工作的。您似乎期望返回类型(必须在编译时知道)以某种方式从字符串的内容(仅在运行时知道)中神奇地派生出来。 -
我天真地认为
MyData data(convert2data("1, 0.1") )会给编译器所需的类型信息,因为它知道构造函数所需的类型。 -
std::tuple有模板化的构造函数或多或少的任何东西(参见 (3) 和 (4) here)。但即使它没有 - 函数模板参数通常是从函数调用参数推导出来的,而不是从它的返回类型推导出来的(有例外 - 从顶部开始,转换运算符可能会从它被要求转换为的类型推导出来;和也许当一个函数被强制转换或分配给一个函数指针时,推论可能同时适用于该指针的参数类型和返回类型,我不太记得了)。
标签: c++ templates tuples variadic-templates specialization