Frage

Ist es möglich, eine templatisierte Methode für Enums spezialisiert zu haben?

So etwas wie (der ungültige Code unten):

template <typename T>
void f(T value);

template <>
void f<enum T>(T value);

In dem Fall ist es nicht möglich, dann habe ich angenommen, ich habe Spezialisierungen für eine Reihe von Typen wie int, unsigned int, long long, unsigned long long, usw., welche der Spezialisierungen wird dann ein Enumswert verwenden?

War es hilfreich?

Lösung

Sie können verwenden std::enable_if mit std::is_enum aus <type_traits> um das zu erreichen.

In einer Antwort auf eine meiner Fragen, Litb hat a gepostet sehr Detaillierte und gut geschriebene Erläuterung, wie dies mit den Boost-Äquivalenten erfolgen kann.

Andere Tipps

Ich bin mir nicht sicher, ob ich Ihre Frage korrekt verstehe, aber Sie können die Vorlage auf bestimmten Enums instanziieren:

template <typename T>
void f(T value);

enum cars { ford, volvo, saab, subaru, toyota };
enum colors { red, black, green, blue };

template <>
void f<cars>(cars) { }

template <>
void f<colors>(colors) { }

int main() {
    f(ford);
    f(red);
}

Vermutlich ist das einzig interessante, was Sie mit einem Typ tun könnten, den sie nur darüber wissen, dass es sich um einen Aufzähler handelt, ist, dass er ihn in seinen zugrunde liegenden Typ wirkt und darauf bedient wird. So könnte das aussehen, wenn James vorgeschlagener Ansatz (auch bekannt als Sfinae):

void Bar(int b); // and/or other underlying types

template<typename T>
typename std::enable_if<std::is_enum<T>::value, void>::type
Foo(T enm)
{
    Bar(static_cast<typename std::underlying_type<T>::type>(enm));
}

Als verwandte Bonus finden Sie hier eine ähnliche Methode, die nur für einen bestimmten Typ Ihrer Wahl gelöst wird (ersetzen Sie BOOL in is_same zur Art Ihrer Wahl):

template<typename T>
typename std::enable_if<std::is_same<T,bool>::value, void>::type
Baz(T bl)
{
    if (bl)
    {
        //...
    }
    else
    {
        //...
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top