Powiedzmy mamTworzenie kartezjański ekspansję iloczyn dwóch zmiennej liczbie argumentów, dla typu parametru szablonu pakuje
- dwa wykazy non typu parameteres szablonów (które mogą mieć inny typ)
- szablon
foo
że ma jedną wartość każdej z tych list jako parametr
jak mogę stworzyć pakiet o zmiennej liczbie argumentów parametru foo
s, parametryczne z iloczyn kartezjański dwóch lista elementów?
Oto co mam na myśli:
template<int ...>
struct u_list {};
template<char ...>
struct c_list {};
template<int, char >
struct foo {};
template<class ...>
struct bar {};
using int_vals = u_list<1, 5, 7>;
using char_vals = c_list<-3, 3>;
using result_t = /* magic happens*/
using ref_t = bar<
foo<1, -3>, foo<1, 3>,
foo<5, -3>, foo<5, 3>,
foo<7, -3>, foo<7, 3>
>;
static_assert(std::is_same<result_t, ref_t >::value, "");
szukam rozwiązanie, które działa w C++ 11 i nie korzysta z żadnych bibliotek wyjątkiem C++ 11 biblioteki standardowej. Mam również moją ręcznie napisaną wersję C++ 14-ego index_sequence
/make_index_sequence
i mogę dostarczyć listy parametrów bez typów jako tablice, jeśli to upraszcza kod.
Najbliższe, jakie udało mi się znaleźć, to: How to create the Cartesian product of a type list?. Zasadniczo (nie przetestowałem tego) powinno być możliwe przekształcenie pakietów parametrów bez typów w pakiety parametrów, a następnie zastosowanie rozwiązania w połączonym poście, ale miałem nadzieję, że istnieje prostsze/krótsze rozwiązanie wzdłuż linie tego:
template<int... Ints, char ... Chars>
auto magic(u_list<Ints...>, c_list<Chars...>)
{
//Doesn't work, as it tries to expand the parameter packs in lock step
return bar<foo<Ints,Chars>...>{};
}
using result_t = decltype(magic(int_vals{}, char_vals{}));
Zrobiłem kilka nieprzyjemnych rzeczy z kombinacjami parametrów ... może to może być pomocne: [\ [kliknij mnie \]] (https://stackoverflow.com/questions/39687907/is-it-possible -to-invoke-a-method-with-all-possible-k-combination-with-repetit) –