从初始化列表中提取模板类型

时间:2014-04-24 03:45:56

标签: c++ templates c++11

我遇到了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}),其中abc都是相同的类型,请说{{ 1}},我收到编译错误:some_type,所以我必须在调用couldn't infer template argument 'T'时手动指定类型。也就是说,例如,当ff<int>({a,b,c});a都是b时,c编译得很好。是否有任何方法可以从标准初始化列表中推断模板类型int,因为该函数被定义为采用T的参数?基本上我只是希望能够在调用std::vector<T>时调用f({initializer_list});而不指定尖括号中initializer_list元素的类型。

2 个答案:

答案 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 postjogojapan说,

  

brace-init-list {...}是C ++ 11的新统一初始化语法,它可用于初始化任何自动,静态或成员变量,如果该变量的类型是已知

由于调用时传递的参数类型是已知的:

f<int>({a,b,c});

它有效。

使用时:

f({a,b,c});

必须推断出类型。因此,它不起作用。

如果您想利用a的类型,可以使用:

f<decltype(a)>({a,b,c});

这应该有效。