Ich bin ein bisschen verwirrt über partielle Template-Spezialisierung ... Ich habe einige Code, der auf einem arithmetischen Datentyp T und auf einer kleinen ganzen Zahl DIM abhängt. Ich möchte in der Lage sein, verschiedene Klassenmethoden für verschiedene DIM-Werte anzugeben. Die Unmöglichkeit, eine teilweise Template-Spezialisierung zu verwenden, führte mich dazu, enable_if zu erkunden. Es ist genau das, was ich brauchte ... außer dass ich eine Nummer und keinen Typ zurückgeben möchte. Wie kann ich das machen? Der folgende Code sollte veranschaulichen, was ich möchte.C++ enable_if für Nicht-Typ Vorlage Parameter
#include <stdio.h>
#include <iostream>
#include <type_traits>
template <typename T, int DIM>
class foo{
public:
T function();
};
template <typename T, int DIM>
T foo<T, std::enable_if<DIM == 1>::value>::function(){
// do something
return 1.0;
}
template <typename T, int DIM>
T foo<T, std::enable_if<DIM == 2>::value>::function(){
// do something else
return 2342.0;
}
int main(){
foo<int, 1> object;
int ak = object.function();
std::cout << ak << "\n";
return 0;
}
Schön, aber ich denke, es ist möglich, es ein wenig einfacher zu machen: ist nicht notwendig jeden Template-Parameter ('U' und' D') zu spiegeln, um SFINAE zu aktivieren: es ist genug ein Template-Parameter in der 'std :: enable_if' Test beteiligt . Also sollte einfach als 'Vorlage :: type * = nullptr> T function() '(und' void' ist der Standard zurückgegebene Typ für 'std :: enable_if' –
max66
Or auch 'template typenname std :: enable_if :: type function()' –
max66
@ max66 Ich habe es nur explizit gemacht (ich bin ursprünglich ein Python-Programmierer, also vor allem bei der Erklärung von Konzepten, ich mag explizite über implizit), aber ja Beide sind absolut gültige Vorschläge, und ich würde Ihren Stil für den Produktionscode verwenden. Obwohl das Entfernen von "U = T" eigentlich ein großartiger Gesamtvorschlag ist. Editiert. –