gpt4 book ai didi

C++11 可变参数模板和逗号分隔表达式等价

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:27 25 4
gpt4 key购买 nike

在可变参数模板中 ... 运算符将参数包扩展为一系列以逗号分隔的参数(以最简单的形式)。我的问题是:为什么以逗号分隔的多个参数调用 some_function() 并使用 ... 运算符调用它却不行?

我说的是这段代码:

template<typename... Args> inline void expand(Args&&... args) 
{
some_function(22),some_function(32); // Works
some_function(args)...; // Doesn't work - ERROR
}

这两行不应该产生相似的输出吗?

最佳答案

正如在另一个答案中所说,通过扩展参数包获得的逗号不是逗号操作符,而是参数列表。将参数列表作为表达式显然是一个错误。由于您不需要函数的返回值,因此您可以尝试以下几行:

template <class... T>
void ignore(T&&...) {}

template<typename... Args> inline void expand(Args&&... args)
{
ignore(some_function(args)...);
}

如果 some_function 返回 void,则包扩展将不起作用,因为您不能将 void “值”赋予函数。您可以返回一个值,也可以使用逗号运算符链接每次调用 some_function:

template<typename... Args> inline void expand(Args&&... args) 
{
ignore( (some_function(args),true)...);
//or:
bool b[] = {(some_function(args),true)...};
}

关于C++11 可变参数模板和逗号分隔表达式等价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16011873/

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