Konstant variable Anzahl von Parametern
-
Hallo,
ist es möglich, einer Funktion eine von einer Konstanten abhängigen Anzahl von Parametern zu geben?
Zum Beispiel bei einer Klasse wie std::array, die N Elemente vom Typ T enthält. Diese Klasse sollte dann einen Konstruktor erhalten, der genau N Argumente vom Typ T annimmt.
-
-
z.B. so
#include <utility> #include <array> #include <type_traits> template <typename... T> struct all_same; template <> struct all_same<> : std::true_type {}; template <typename T, typename... U> struct all_same<T, U...> : std::is_same<all_same<T, U...>, all_same<U..., T>> {}; template <typename T, int N> struct my_array { // template <typename... U, typename std::enable_if<sizeof...(U)==N // && all_same<std:.true_type, typename std::is_convertible<U,T>::type...>::value, int>::type = 0> template <typename... U> my_array(U&&... args) : data{ std::forward<U>( args ) ... } { static_assert( sizeof...(U) == N, "falsche Parameteranzahl" ); static_assert( all_same<std::true_type, typename std::is_convertible<U,T>::type...>::value, "inkompatibler Parameter" ); } T data[N]; };Man kann auch eine entsprechende Typliste im voraus erstellen und als Parameterpack verwenden
#include <utility> #include <array> #include <type_traits> template <typename... T> struct type_list; template <typename T, int N, typename = type_list<>> struct repeat_types; template <typename T, int N, typename... U> struct repeat_types<T, N, type_list<U...>> : repeat_types<T, N-1, type_list<T, U...>> {}; template <typename T, typename... U> struct repeat_types<T, 0, type_list<U...>> { typedef type_list<U...> type; }; template <typename T, int N, typename = typename repeat_types<T, N>::type> struct my_array; template <typename T, int N, typename... U> struct my_array<T, N, type_list<U...>> { my_array(const U&... args) : data{ args... } {} T data[N]; };
-
Danke, camper, ich habe die erste Variante übernommen
