c++ 对应于带有大括号文字列表的函数调用的参数[重复]

kkih6yb8  于 2023-07-01  发布在  其他
关注(0)|答案(3)|浏览(112)

此问题已存在

Iterating over a short, fixed list of strings [closed]
4天前关闭。
根据Iterating over a short, fixed list of strings的评论,在现代C++中,你可以这样写:

for (auto color: {"red", "green", "blue"})

你能用函数调用做类似的事情吗?如果可以,相应的参数声明语法是什么?换句话说

void foo( /* ... */ )

foo({"red", "green", "blue"});

...应该用什么代替?

inn6fuwd

inn6fuwd1#

下面是一个带有参数包和折叠表达式的替代方法:

#include <iostream>
#include <utility>

template <class... Args>
void foo(Args&&...args) {
    (..., (std::cout << std::forward<Args>(args) << ' '));
}

int main() {
    foo("red", "green", "blue");
}
ngynwnxp

ngynwnxp2#

你也可以用一个函数模板来实现:

#include <string_view>
#include <iostream>

template<std::size_t N>
void foo(const std::string_view(&strings)[N])
{
    for (const auto string : strings)
    {
        std::cout << string << "\n";
    }
}

int main()
{
    foo({ "red","green","blue" });
    return 0;
}
vxqlmq5t

vxqlmq5t3#

你可以的通常的方法是将foo声明为接受initializer_list,例如:

#include <iostream>
#include <string>
#include <initializer_list>

void foo (std::initializer_list <std::string> il)
{
    for (const auto &s : il)
        std::cout << s << " ";
}

int main()
{
    foo ({"red", "green", "blue"});
}

注意,例如,std::vector就有这样一个构造函数,并且列表中的所有对象都必须是相同的类型。

相关问题