with a package extension with two parameters, you can (try) to build each element of a given tuple with all the given function parameters:
template <class T> struct tuple_construct_t; template <class... Ts> struct tuple_construct_t<std::tuple<Ts...>> { template <class... Args> static std::tuple<Ts...> make_tuple(Args&&... args) { //this is the central part - the double pack expansion return std::make_tuple(Ts{args...}...); } }; // a little free helper function... template <class Tup, class... Args> Tup construct_tuple(Args&&... args) { return tuple_construct_t<Tup>::make_tuple(std::forward<Args>(args)...); }
And then somewhere in the code:
typedef std::tuple<NoDefault1, NoDefault2> myTuple; auto t = construct_tuple<myTuple>(Foo{}, Bar{});
full working example: Link
Edit:
Since @Rakvan deleted his answer, I will save the second (correct) part of it:
template <class ... Ts, class ... Args> std::tuple<Ts...> cartesian_make_tuple(Args && ... args) { return std::make_tuple(Ts{args...}...); }
here is the workflow
Arne mertz
source share