将初始化程序作为参数传递

时间:2014-04-10 21:40:34

标签: c++ c++11 initializer

初始化程序是否有类型?如果是的话,那是什么?在这种情况下,我怎样才能使以下代码有效?

template <typename T>
int f(T a)
{
    return 0;
}

int main()
{
    f({1,2});
}

它出现以下错误:

  

c.cpp:32:2:错误:没有匹配函数来调用'f'           F({1,2});           ^ c.cpp:18:5:注意:候选模板被忽略:无法推断模板参数'T'int f(T a)       生成^ 1错误。

2 个答案:

答案 0 :(得分:3)

撰写f({1,2})时,您正在使用list initialization

如果您想将initializer list {1,2}传递给函数,可以这样做:

#include <initializer_list>
#include <iostream>

template <typename T>
int f(std::initializer_list<T> a) {
    for(const T& x : a) {
        std::cout << x << ", " << std::endl; // do something with the element
    }
    return 0;
}

int main() {
    f({1,2});
}

答案 1 :(得分:1)

如果您想为列表中的每个值执行函数,可以执行以下操作:

#include <iostream>

template <typename T>
int f(T a)
{
    return 0;
}

int main()
{
    for (int a : {1,2})
        std::cout << f(a) << std::endl;
}

注意这需要c ++ 11兼容的编译器

如果你想将列表传递给你的函数,那么就像这样:

#include <iostream>
#include <initializer_list>

template <typename T>
int f(T a)
{
    return 0;
}

int main()
{
    std::cout << f(std::initializer_list<int>{1, 2}) << std::endl;
}