2016-05-20 14 views
1

Ich habe eine Klasse, die ich auf der Grundlage des Werts in der Vorlage verschiedene Aktionen ausführen muss. Aber ich erhalte eine Fehlermeldung „Prototyp passt nicht jeder in der Klasse ...“Auswahl der Elementfunktion mit Enable_if

#include <iostream> 
#include <type_traits> 
using namespace std; 

template<int t> 
struct A 
{ 
    template<typename EqualTwo> 
    void test(); 
}; 

template<int t> 
template<typename std::enable_if<t == 2>::value> 
void A<t>::test() 
{ 
    cout << "T is equal to two."; 
} 

template<int t> 
template<typename std::enable_if<t != 2>::value> 
void A<t>::test() 
{ 
    cout << "T is not equal to two."; 
} 

int main() { 
    A<5> five; 
    A<2> two; 
    cout << five.test() << endl; 
    cout << two.test() << endl; 
    return 0; 
} 

Antwort

2

Ihr Code vermasselt wird, wahrscheinlich das, was Sie tun möchten, ist die folgende:

template<int t, typename Enable = void> 
struct A; 

template<int t> 
struct A<t, typename std::enable_if<t == 2>::type> { 
    void test() { cout << "T is equal to two." << endl; } 
}; 

template<int t> 
struct A<t, typename std::enable_if<t != 2>::type> { 
    void test() { cout << "T is not equal to two." << endl; } 
}; 

und in main():

int main() { 
    A<5> five; 
    A<2> two; 
    five.test(); 
    two.test(); 
} 

Live Demo

Edit:

Leider können Sie eine Memberfunktion einer Vorlagenklasse nicht spezialisieren, es sei denn, Sie spezialisieren die Klasse selbst.

Sie könnten jedoch wie folgt vorgehen:

template<int t> 
struct A { 
    void test() { 
    if(t == 2) { 
     cout << "T is equal to two." << endl; 
    } else { 
     cout << "T is not equal to two" << endl; 
    } 
    } 
}; 
+0

In meinem realen Code, nicht dem Beispiel, ich habe viele andere Mitgliedsvariablen und Funktionen, die spezialisiert werden nicht müssen. Nur diese eine Funktion. Gibt es keine Möglichkeit, zwischen dieser einen Funktion zu wechseln? – JadziaMD

+0

@JadziaMD Siehe meine Bearbeitung. – 101010

+1

@JadziaMD Sie können auch Vererbung verwenden: eine Basisklasse mit gemeinsamem Code und so vielen abgeleiteten, wie Sie benötigen. siehe [Beispiel] (http://coliru.stacked-crooked.com/a/ffc4a858f36cd2b2) basierend auf der primären Antwort – Garf365

Verwandte Themen