c++ - 使用 && 运算符加入折叠/可变表达式的输出

标签 c++ c++17 variadic-templates fold-expression

如果对 parse(...) 的所有调用都返回 true,则函数 all_checked 将返回 true , 否则为 false

如何将所有输出链接在一起,以便有效地获得

success = parse(args[0]) && parse(args[1]) && parse(args[2]) && ...;

现在,它只返回最后一个元素的 parse(...)

#include <string>

template<class T>
bool parse(const T& val)
{
    if constexpr (std::is_same_v<T, int> || std::is_same_v<T, std::string>)
        return true;
    else
        return false;
}

template<class... Args>
bool all_checked(const Args& ... args)
{
    bool success = (parse(args), ...);  // should be true if all parse(...) are true
    return success;
}

int main()
{
    bool result = all_checked(1, 5.9, std::string("abc"));
}

我试过其他语法,比如

bool success = true;
(success = success && parse(args), ...);

但它没有编译。

最佳答案

只是:

return (parse(args) && ...);

或者:

bool const success = (parse(args) && ...);
return success;

您的第一个版本是折叠一个逗号,它会丢弃所有结果,直到最后一个:

bool success = (parse(args), ...);

评估为(让我们假设三件事):

bool success = (parse(args0), parse(args1), parse(args2));

这与:

parse(args0);
parse(args1);
bool success = parse(args2);

第二个只需要一对额外的括号,但无论如何都是一种非常困惑的写法。

关于c++ - 使用 && 运算符加入折叠/可变表达式的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57678380/

相关文章:

c++ - 如何在 xt::filter 中使用相等性?

c++ - 如何在 C++ 中动态分配连续的二维数组?

c++ - 非类型参数的非推导上下文

c++ - 模板实例化解析错误

c++ - 如何推断可变参数之后的模板参数?

c++ - 当可变参数模板类继承自模板参数时,在调用基类型的方法时扩展参数包

c++ - 根据函数签名将可变参数模板中的类型转发为值/引用

c++ - 线程构造的性能成本 : missed optimisations and memory allocation

c++ - 用 C++ : legal or not? 重新解释这个

c++ - 为什么我的程序在分配更多线程的情况下执行时间更长?