我遇到了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
都是相同的类型,请说{{ 1}},我收到编译错误:some_type
,所以我必须在调用couldn't infer template argument 'T'
时手动指定类型。也就是说,例如,当f
,f<int>({a,b,c});
和a
都是b
时,c
编译得很好。是否有任何方法可以从标准初始化列表中推断模板类型int
,因为该函数被定义为采用T
的参数?基本上我只是希望能够在调用std::vector<T>
时调用f({initializer_list});
而不指定尖括号中initializer_list
元素的类型。
答案 0 :(得分:5)
你可以定义
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})
会。
答案 1 :(得分:-1)
在answer to another SO post,jogojapan说,
brace-init-list {...}是C ++ 11的新统一初始化语法,它可用于初始化任何自动,静态或成员变量,如果该变量的类型是已知
由于调用时传递的参数类型是已知的:
f<int>({a,b,c});
它有效。
使用时:
f({a,b,c});
必须推断出类型。因此,它不起作用。
如果您想利用a
的类型,可以使用:
f<decltype(a)>({a,b,c});
这应该有效。