C++ 从初始值设定项列表中提取模板类型
我对C++11模板化代码有问题。我有一个模板函数C++ 从初始值设定项列表中提取模板类型,c++,templates,c++11,C++,Templates,C++11,我对C++11模板化代码有问题。我有一个模板函数 template <typename T> f(const std::vector<T>& v) { /* do something here*/ }; 模板 f(常数标准::向量和v) { /*在这里做点什么*/ }; 当我调用f(v)时,其中v被声明为std::vector v,程序编译得很好。但是,如果我将一个初始值设定项列表传递给f,比如f({a,b,c})
template <typename T>
f(const std::vector<T>& v)
{
/* do something here*/
};
模板
f(常数标准::向量和v)
{
/*在这里做点什么*/
};
当我调用f(v)
时,其中v
被声明为std::vector v代码>,程序编译得很好。但是,如果我将一个初始值设定项列表传递给f
,比如f({a,b,c})
,其中a
,b
,c
都是相同的类型,比如说某些类型
,我会得到一个编译错误:无法推断模板参数“t”
,因此我必须在调用f
时手动指定类型。即,例如,f({a,b,c})当a
、b
和c
都是int
s时,code>编译得很好。如果函数定义为采用参数std::vector
,是否有任何方法可以从标准初始值设定项列表推断模板类型T
?基本上我只想能够调用f({initializer\u list})调用f
时,无需指定尖括号中初始值设定项列表的元素类型,即可定义
template<typename T>
void f(const std::initializer_list<T>& v) {
f(std::vector<T>(v));
}
模板
无效f(常数标准::初始值设定项列表&v){
f(std::vector(v));
}
要使其工作,初始值设定项列表必须是某种明确的类型,因此f({0,1.41421,2.71828,3.14159})
不起作用,但f({0.0,1.41421,2.71828,3.14159})
将起作用
大括号init list{…}是C++11新的统一初始化语法,如果已知任何自动、静态或成员变量的类型,则可以使用它初始化该变量
由于调用时已知要传递的参数类型:
f<int>({a,b,c});
必须推导出类型。因此,它不起作用
如果您想利用a
的类型,可以使用:
f<decltype(a)>({a,b,c});
f({a,b,c});
这应该行。不,仍然得到相同的错误注意:候选模板被忽略:替换失败
它实际上有效,非常感谢,我调用的是f(l)
,而不是f(std::vector(l))
,所以我实际上没有从初始值设定项列表中构造向量。。。C++模板语法吸收大的时间……一个问题:现在假设我有一个初始化程序列表,包含“让我们说,代码> {x,y,z } /CODE>,其中<代码> x<代码>,<代码> y>代码>,代码> z <代码> 3种不同类型,但是所有的安全性都可以转换为另一个代码> W< /代码>类型。(假设x
是double
,y
是int
,z
是float
,所有这些都可以转换为W
,在本例中是adouble
)。我如何写下一个接受此列表作为参数的泛型函数,而不抱怨类型不匹配?所有这些令人头痛的问题都来自这样一个事实:我使用的是Eigen
矩阵库,其中a
类型为matrix
,而a*B
类型为MatrixProduct
,a+B*C
的类型是Sum\u of_Product
等等……但所有这些表达式都可以安全地强制转换为Matrix
@vsoftco:AFAIK,您必须将每个表达式显式地强制转换为Matrix
(我个人会使用宏).initialization\u列表有其局限性。当然,如果你只是使用本征矩阵,你实际上不需要模板f
,没有模板,你可以实现自动转换。简而言之,这两者都很好。OP是在谈论函数。你似乎在谈论构造函数(即对象初始化),这是完全不同的。@rici在这种特殊用法中,从初始值设定项列表
构造一个临时对象是必要的。不明白…所以基本上你是说你不能从初始值设定项列表推断模板类型?类型应该在编译时就知道,毕竟它是一个模板…@vsoftco是的,这是w我理解。这很奇怪,因为类型在编译时是已知的,所以类型检查应该在编译时而不是运行时进行。我正在应用函数的参数以前声明过,并且有一个定义非常好的类型:)
f<decltype(a)>({a,b,c});