Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从初始值设定项列表中提取模板类型_C++_Templates_C++11 - Fatal编程技术网

C++ 从初始值设定项列表中提取模板类型

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})

我对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})
,其中
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
,在本例中是a
double
)。我如何写下一个接受此列表作为参数的泛型函数,而不抱怨类型不匹配?所有这些令人头痛的问题都来自这样一个事实:我使用的是
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});