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.




  • Mod

    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 🙂


Anmelden zum Antworten