将初始值设定项作为参数传递

Passing initializer as argument

本文关键字:参数传递      更新时间:2023-10-16

初始值设定项有类型吗?如果是,那是什么?在这种情况下,我如何使以下代码工作?

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(Ta)^生成1个错误。

在编写f({1,2})时,使用的是列表初始化。

如果你想按原样将初始化器列表{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});
}

如果你想为列表中的每个值执行函数,你可以这样做:

#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;
}