使用 && 运算符加入 fold/variadic 表达式的输出
Join outputs from fold/variadic expression with && operator
函数 all_checked
意味着 return true
如果所有调用 parse(...)
returned true
和 false
否则。
我怎样才能link把所有的输出放在一起,这样我才能有效地得到
success = parse(args[0]) && parse(args[1]) && parse(args[2]) && ...;
现在,最后一个元素只有 returns 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);
第二个只需要一对额外的括号,但无论如何都是一种非常混乱的写法。
你的折叠表达式应该是 (<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
.
函数 all_checked
意味着 return true
如果所有调用 parse(...)
returned true
和 false
否则。
我怎样才能link把所有的输出放在一起,这样我才能有效地得到
success = parse(args[0]) && parse(args[1]) && parse(args[2]) && ...;
现在,最后一个元素只有 returns 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);
第二个只需要一对额外的括号,但无论如何都是一种非常混乱的写法。
你的折叠表达式应该是 (<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
.