2012-05-22 6 views
10

ich mich in Vorlage Meta-Programmierung das Gefühl, langsam und ich bin nicht sicher, wie die folgende implementieren:C++ Template-Spezialisierung basiert auf der Kompilierung Wert

// hpp file 
enum MyEnum { Alive = 0, Dead }; 
class A { 
    public: 
     template<typename T, typename O, MyEnum ls> 
     static int Register(); 
}; 

// elsewhere in the code... 
A::Register<IType1, Type1, Dead>(); 

Beim Kompilieren ich weiß, was Aufzählungswert Der dritte Vorlagentyp ist (kompilierungszeitunabhängig), entweder Dead oder Alive. Ist es möglich, zwei Stellen für die Register-Funktion, so etwas wie zu definieren:

// desired hpp file 
template<typename T, typename O, Alive> 
int Register(); 

template<typename T, typename O, Dead> 
int Register(); 

// corresponding desired .inc file 
template<typename T, typename O, Alive> 
int Register() { // Alive specific implementation ... } 

template<typename T, typename O, Dead> 
int Register() { // Dead specific implementation ... } 

ich einen Blick genommen zu haben: C++ Template Specialization with Constant Value

aber ich habe nicht in der Lage gewesen, um herauszufinden, wie man es machen gelten diese Situation.

Antwort

11

Template-Funktionen nicht teilweise spezialisiert werden kann. Die Lösung ist, es in eine Struktur zu wickeln:

+0

funktioniert perfekt! Danke Pubby – Short

0

Sehr spät auf die Party hier, aber.

Ein Weg, dies zu tun, was ich denke, ist vom Konzept her einfacher und auch leichter einfach zu lesen ist, die verschiedenen Werte der Enum verschiedener Typen macht (in einem Namensraum, sie sauber zu halten), und nutzt (Template Funktion Überlastung):

namespace State { 
    struct Dead {}; 
    struct Alive {}; 
} 

template<typename T, typename O> 
int Register(State::Dead) { 
    return 1; 
} 

template<typename T, typename O> 
int Register(State::Alive) { 
    return 2; 
} 

Sie nennen sie wie folgt aus:

int main() { 
    Register<int,int>(State::Dead()); 
    Register<int,int>(State::Alive()); 
    return 0; 
}