从初始值设定项列表中提取模板类型
Extract template type from initializer list
我对C++11模板化代码有问题。我有一个模板功能
template <typename T>
f(const std::vector<T>& v)
{
/* do something here*/
};
当我调用f(v)
时,其中v
被声明为std::vector<some_type> v;
,程序编译得很好。然而,如果我将初始值设定项列表传递给f
,比如f({a,b,c})
,其中a
、b
、c
都是相同的类型,比如说some_type
,我会得到一个编译错误:couldn't infer template argument 'T'
,所以我必须在调用f
时手动指定类型。也就是说,例如,当a
、b
和c
都是int
s时,f<int>({a,b,c});
编译得很好。如果函数被定义为取std::vector<T>
的参数,有没有办法从标准初始化器列表中推断模板类型T
?基本上,我只想在调用f
时能够调用f({initializer_list});
,而无需在尖括号中指定initializer_list
的元素类型。
您可以定义
template<typename T>
void f(const std::initializer_list<T>& v) {
f(std::vector<T>(v));
}
为了实现这一点,initializer_list必须具有某种明确的类型,因此f({0, 1.41421, 2.71828, 3.14159 })
不起作用,但f({0.0, 1.41421, 2.71828, 3.14159})
会起作用。
日本政府在回答另一篇SO帖子时表示,
大括号init list{…}是C++11的新的统一初始化语法,如果变量的类型已知,它可以用于初始化任何自动、静态或成员变量。
由于当您调用时,传递的参数类型是已知的:
f<int>({a,b,c});
它是有效的。
使用时:
f({a,b,c});
必须推导出类型。因此,它不起作用。
如果你想利用a
类型,你可以使用:
f<decltype(a)>({a,b,c});
这应该行得通。
相关文章:
- C++从通用引用中提取实际类型
- Clang 工具,用于提取给定 lambda 类型的 lambda 主体
- 将不同类型的模板参数包提取到双精度向量中会产生警告
- 在C++如何从数组中提取成员并返回成员类型的数组?
- 从 Any 包中提取和匹配 protobuf 消息类型名的首选方法
- 从具有部分专用化的boost:hana::set中提取类型失败
- 如何提取模板参数中传递的类型
- 从 std::set 中提取仅移动类型
- 需要根据读取的数据类型将ifstream提取到单独的数组中
- 如何定义变体<x,y,z>提取模板参数的子类型
- 从传递给模板函数的内部类实例中提取外部类类型
- 防止为字符串流提取运算符不支持的类型实例化模板类 (>>)
- C++ HDF5 提取复合数据类型的一个成员
- 从参数包中提取成员类型
- 如何使用 boost::p ython 从 Python 类型中提取包装的C++类型
- 从字符串中提取不同的数据类型变量
- 您可以从模板参数函数签名中提取类型吗?
- c++:有没有办法从实例化的模板中提取类型?
- 从printf格式字符串中提取类型信息
- 是否可以自动从可区分的联合中提取类型