Variable pack in C++

Viewed 179

There is already parameter pack in C++, can i declare a variable pack based on the parameter pack?

E.g.,

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

EDIT

Or a little bit more complex,

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())); 
}
2 Answers

Yes, you can use pack expansion in lambda init-capture to do this.

#include <utility>

template<typename... Args>
bool all(Args... args) {
  return [&...member_a = std::as_const(args.a)] {
    return (... && (member_a.isValidState() && member_a.isStateStable())); 
  }();
}

Demo.

You can use a tuple to store them, but in your example you could just access isValidState and isStableState directly on args.

#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())); 
}
Related