gpt4 book ai didi

c++ - 具有可变数量的已知类型的参数的函数,c++ 11方式

转载 作者:IT老高 更新时间:2023-10-28 21:55:44 27 4
gpt4 key购买 nike

我已经知道 stdarg.h 方法在 C++ 中使用可变参数的函数,正如所讨论的 here例如。我也知道 c++11 标准有可变参数模板,如 here 所述.

但在上述两种方案中,我们都不知道(也不能强制)编译时的参数类型 afaik。我正在寻找的是将 known types 的变量参数传递给函数。我认为这是可以做到的,因为我读过它here :

Variadic templates, which can also be used to create functions that take variable number of arguments, are often the better choice because they do not impose restrictions on the types of the arguments, do not perform integral and floating-point promotions, and are type safe.

有可能吗?如果是,我该怎么做?

最佳答案

使用可变参数模板编写函数很简单,它接受任意数量的参数。与一般模式的唯一区别是,具体类型用作第一个参数(头) - 而不是模板参数。以下示例显示了一个函数 foobar,它接受任意数量的字符串。

// used for end of recursion - and for the empty arguments list
void foobar() { }

template <typename ...Tail>
void foobar(const std::string& head, Tail&&... tail)
{
// do something with head
std::cout << head << '\n';
// call foobar recursively with remaining arguments
foobar(std::forward<Tail>(tail)...);
}

foobar("Hello", "World", "...");

就个人而言,我更喜欢使用 std::initializer_list 而不是可变参数模板。因为可变参数模板更复杂,需要额外的经验。使用 std::initializer_list,它可能看起来像这样:

void foobar(std::initializer_list<std::string> values)
{
for (auto& value : values) {
// do something with value
std::cout << value << '\n';
}
}

foobar({ "Hello", "World", "...", });

不幸的是,将 std::initializer_list 与常规函数一起使用时需要额外的花括号。如果使用新的初始值设定项语法,则构造函数不需要它们。

编辑:根据反馈重写答案。特别是我更改了两个解决方案/示例的顺序。

关于c++ - 具有可变数量的已知类型的参数的函数,c++ 11方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10044449/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com