Template auf enums beschränken



  • Hi!

    Ich frage mich, gibts es eine Möglichkeit, ein Funktionstemplate (das eine Referenz auf einen Typ als Parameter akzeptieren und den selben Typ als Ergebnis liefern soll) auf enums zu beschränken? Wenn ich ein herkömmliches Template schreibe, würde der Compiler ja bekanntlich für jeden Datentyp das Funktionstemplate instanziieren. Ich möchte aber, daß er das Template nur auf enum-Datentypen anwendet, weil es nur auf solche Datentypen Sinn macht.

    Ist das möglich?

    Ich könnte das Template natürlich völlig generisch lassen, aber ich würde z.B. für alle nicht-enum Typen gerne ein anderes Funktionstemplate schreiben, ohne dabei ihn Mehrdeutigekeiten zu geraten.



  • Ich bin mir nicht vollkommen sicher, aber ich glaube nicht, dass das geht. Zumindest nicht mit den Grundmitteln der Sprache.

    Du kannst höchstens die Template-Funktion für ein bestimmtes (KEIN anonymes) enum spezialisieren. Anonyme enums lehnt der Compiler bei mir ab (error: no matching function for call to `foo(<anonymous enum>)').

    Dann kannst du aber auch normale Überladung verwenden. Oder vertrau deinem Anwender 😉


  • Mod

    edit: müll


  • Mod

    ein versuch

    #include "boost/type_traits.hpp"
    // generic
    template<typename T, bool>
    struct Foo
    {
    	T operator()(T& t)
    	{
    		// ...
    		std::cout << "generic\n";
    		return T();
    	}
    };
    // enum
    template<typename T>
    struct Foo< T, true >
    {
    	T operator()(T& t)
    	{
    		// ...
    		std::cout << "enum\n";
    		return T();
    	}
    };
    template<typename T>
    T foo(T& t)
    {
    	return Foo< T, boost::is_enum< T >::value >()( t );
    }
    


  • Hallo,
    boost::type_traits und boost::enable_if sollten alles sein, was du dazu brauchst.


Anmelden zum Antworten