2012-04-04 3 views
5

Bei einer VorlageSpezialisieren Vorlage basiert auf Positivität Argumentations

template <int n> 
void f(){...}; 

Ich weiß, dass ich es für bestimmte Werte von n, indem Sie spezialisieren können:

template <> 
void f<2>(){...}; 

Aber gibt es ein Verfahren, das mir erlaubt, es für alle positiven n zu spezialisieren?

Ich dachte an die folgende

template <int n> 
void f<n>(){ 
    int dummy[n]; //invalid for n < 0 
    ... 
}; 

Also für n<0 tut dieser Code ungültig ist und der Compiler auf die vorherige Definition zurückgreifen würde. Leider bekomme ich nur einen redefinition of 'void f<n>()' Fehler.

Hinweis: Ich schätze, das wird wahrscheinlich nicht vom Standard unterstützt. Ich frage, ob es eine Methode (vielleicht einige Template-Metaprogrammierung) gibt, um diesen Effekt zu erzielen.

Antwort

13

Eine Option wäre die Verwendung einer anderen Ebene der Indirektion. Definieren Sie eine Hilfsvorlage, die zwei Argumente akzeptiert - die Zahl n und eine bool, die angibt, ob n negativ ist oder nicht, und spezialisieren Sie diese Vorlage dann, wenn n negativ ist. Dann haben Sie Ihre f Funktion instanziieren Sie die Vorlage mit den richtigen Argumenten.

Zum Beispiel:

template <int n, bool isNegative> struct fImpl { 
    static void f() { 
     /* ... code for when n is positive ... */ 
    } 
}; 
template <int n> struct fImpl<n, true> { 
    static void f() { 
     /* ... code for when n is negative ... */ 
    } 
}; 

template <int n> void f() { 
    fImpl<n, (n < 0)>::f(); 
} 

Eine weitere Option ist die SFINAE overloading und std::enable_if Template-Klasse zu verwenden, um von C++ 11 (oder äquivalent des Boost);

template <int n> void f(typename std::enable_if<(n < 0)>::type* = 0) { 
    /* ... n is negative ... */ 
} 

template <int n> void f(typename std::enable_if<(n >= 0)>::type* = 0) { 
    /* ... n is positive ... */ 
} 

werden Jede dieser Funktionen nur für die Überladungsauflösung zur Verfügung, wenn n das richtige Vorzeichen hat, so dass die richtige Version immer genannt werden.

Hoffe, das hilft!

+5

Matter of Style, aber ich bevorzuge die 'enable_if' auf den Rückgabetyp, so gibt es keinen magischen Parameter um verwirrende Dinge (Benutzer und der Typ der Funktion). – GManNickG

Verwandte Themen