void als variadic-template-Parameter



  • Hallo zusammen,

    also ich habe ein Tupel von Objekten. Jetzt möchte ich ein anderes (eigenes) Tupel haben, in dem bestimmte Informationen aus diesen Objekten abgelegt werden.
    Jetzt muss allerdings nicht jedes Objekt Informationen enthalten, so dass ich gerne an dieser Stelle ein void hätte.

    template<typename T>
    struct Member{
    	Member(const T& t) : value(t) {}
    	T value;
    };
    
    template<>
    struct Member<void>{
    	Member(void){}
    };
    
    template<typename...T>
    struct Tuple : public Member<T>...{
    	Tuple(const T&... t) : Member<T>(t)...{}
    };
    
    void get(){}
    
    int main(){
    	Tuple<int, char, double> t3(2, 'c', 1.0d);
    	Tuple<int, char, double, void> t4(2, 'c', 1.0d, get());
    }
    

    Also generell ohne Berücksichtigung von void würde es etwa aussehen wie oben.

    Allerdings kriegt man Probleme, da unter anderem keine Referenz auf void bilden kann:

    test.cpp: In instantiation of 'Tuple<int, char, double, void>':
    test.cpp:24:35: instantiated from here
    test.cpp:14:2: error: forming reference to void
    test.cpp: In function 'int main()':
    test.cpp:24:55: error: invalid use of void expression

    Wie würdet ihr vorgehen um void in einem eigenen Tupel zu ermöglichen?

    Gruß,
    XSpille


  • Administrator

    Für sowas eignet sich meistens Leer- oder Nullklassen/-objekte zu verwenden.

    class Empty { };
    

    Grüssli



  • Dravere schrieb:

    Für sowas eignet sich meistens Leer- oder Nullklassen/-objekte zu verwenden.

    class Empty { };
    

    Grüssli

    Danke Dravere...

    Genau das wollte ich eigentlich vermeiden 🙂

    EDIT: Aber immerhin kann ich es intern wieder zum void machen...


Anmelden zum Antworten