1

如果所有调用都返回,则函数all_checked意味着返回,否则。trueparse(...)truefalse

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

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), ...);

但它没有编译。

4

2 回答 2

4

只是:

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);

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

于 2019-08-27T15:59:35.897 回答
4

您的折叠表达式应为(<expression> <operation to fold> ...). 使用你的all_checked成为

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

你也可以改变

template<class T>
bool parse(const T& val)

template<class T>
bool parse(const T&)

因此您不会收到关于未使用变量的大量警告,因为您从未实际使用过val.

于 2019-08-27T15:59:44.080 回答