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

vso*_*tco 3 c++ templates c++11

我有一个C++ 11模板化代码的问题.我有一个模板功能

    template <typename T> 
    f(const std::vector<T>& v)
    {
      /* do something here*/
    };
Run Code Online (Sandbox Code Playgroud)

当我调用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.也就是说,例如,f<int>({a,b,c});编译时很好a,b并且c都是ints.是否有任何方法可以T从标准初始化列表中推断模板类型,因为该函数被定义为采用参数std::vector<T>?基本上我只是希望能够在调用时f({initializer_list});不指定initializer_list尖括号中元素的类型来调用f.

ric*_*ici 5

你可以定义

template<typename T>
void f(const std::initializer_list<T>& v) {
  f(std::vector<T>(v));
}
Run Code Online (Sandbox Code Playgroud)

为了使这个工作,initializer_list必须是一些明确的类型,所以f({0, 1.41421, 2.71828, 3.14159 })不会工作,但f({0.0, 1.41421, 2.71828, 3.14159})会.