C++ 中的变量包
Variable pack in C++
C++中已经有参数包,我可以根据参数包声明一个变量包吗?
例如,
template<typename... Args>
bool all(Args... args)
{
// Is the following definition of member_a possible?
auto const & member_a = args.a; ...
return (... (member_a.isValidState() && member_a.isStateStable()));
}
编辑
或者稍微复杂一点,
template<typename... Args>
bool all(Args... args)
{
// function returnCurrentOrLast can be expensive, so it's
// desired to call it once.
auto const & a = args.returnCurrentOrLast(true); ...
return (... (a.isValidState() && a.isStateStable()));
}
是的,您可以使用 pack expansion in lambda init-capture 来做到这一点。
#include <utility>
template<typename... Args>
bool all(Args... args) {
return [&...member_a = std::as_const(args.a)] {
return (... && (member_a.isValidState() && member_a.isStateStable()));
}();
}
您可以使用元组来存储它们,但在您的示例中,您可以直接在 args
.
上访问 isValidState
和 isStableState
#include <tuple>
template<typename... Args>
bool all(Args... args)
{
auto tuple_members = std::make_tuple(args.a...); // This works, but why?
return (... && (args.a.isValidState() && args.a.isStateStable()));
}
C++中已经有参数包,我可以根据参数包声明一个变量包吗?
例如,
template<typename... Args>
bool all(Args... args)
{
// Is the following definition of member_a possible?
auto const & member_a = args.a; ...
return (... (member_a.isValidState() && member_a.isStateStable()));
}
编辑
或者稍微复杂一点,
template<typename... Args>
bool all(Args... args)
{
// function returnCurrentOrLast can be expensive, so it's
// desired to call it once.
auto const & a = args.returnCurrentOrLast(true); ...
return (... (a.isValidState() && a.isStateStable()));
}
是的,您可以使用 pack expansion in lambda init-capture 来做到这一点。
#include <utility>
template<typename... Args>
bool all(Args... args) {
return [&...member_a = std::as_const(args.a)] {
return (... && (member_a.isValidState() && member_a.isStateStable()));
}();
}
您可以使用元组来存储它们,但在您的示例中,您可以直接在 args
.
isValidState
和 isStableState
#include <tuple>
template<typename... Args>
bool all(Args... args)
{
auto tuple_members = std::make_tuple(args.a...); // This works, but why?
return (... && (args.a.isValidState() && args.a.isStateStable()));
}