2016-08-02 38 views
0

ich viele Objekte definiert haben, und für einige von ihnen, definiert ich eine Funktion:Prüft, ob ein nicht Elementfunktion vorhanden ist (SFINAE)

template <typename Ratio> 
auto print(const T &t, bool a= true, bool b= true) 
{ 
    std::stringstream ss; 
    // ... do stuff ... 
    return ss.str(); 
} 

wobei T die Art von einem der Objekte, für die Druck ist definiert. Das Verhältnis wird innerhalb der Funktion verwendet.

Meine Frage ist: Gibt es eine Möglichkeit für einen Typ T zu finden, ob diese Funktion existiert?

Für andere verwendet, habe ich bereits Vorlagen und SFINAE verwendet, um festzustellen, ob eine Klassenmitgliedsmethode existiert. Aber für mein Problem hier, ich kann die Lösung nicht finden ... Jeder?

Danke, Ben

PS: Beispiel SFINAE in meinem Code verwenden, wobei i ist gegeben, wenn ein Klassenmitglied Verfahren zum Nachweis erforderlich.

static T none() { ... } 

/** 
* SFINAE for checking id none method exists 
*/ 
template <class T> 
static auto hasNoneMethod(int) 
    -> std::integral_constant<bool, std::is_same<T, decltype(T::none())>::value>; 
template <class> 
static auto hasNoneMethod(...) -> std::false_type; 

/** 
* Type-Function 
*/ 
template <typename T> 
struct HasNoneMethod: decltype(detail::hasNoneMethod<T>(0)) { 
}; 
+1

Vorlage du meinst T? –

+0

Sie haben ein 'typename Ratio', aber verwenden Sie' T' ... Sind sie der gleiche Parameter? Hast du irgendwas probiert? – Holt

+0

Was meinst du damit existiert? So wie es aussieht (vorausgesetzt, Sie korrigieren Ihren Template-Parameternamen typo), wird es automatisch für jeden Typ erzeugt, mit dem Sie es verwenden möchten, da es keine SFINAE-Constraints hat. – Smeeheey

Antwort

1

Sie können so etwas wie folgt verwenden:

template <class T> 
static auto hasPrintMethod(int) 
->std::integral_constant<bool, std::is_class<decltype(print(T()))>::value>; 

template <class> 
static auto hasPrintMethod(...)->std::false_type; 

template <typename T> 
struct HasPrintMethod : decltype(hasPrintMethod<T>(0)) { 
}; 

Hier die decltype(print(T())) ist std::string für Klassen, für die Ihre Nicht-Elementfunktion definiert ist, und eine fehlerhafte Art für andere Klassen. Nach dem SFINAE-Konzept ist also HasPrintMethod<A>::value gleich true für class A mit print Funktion definiert und ist ansonsten gleich false.

+0

Vielen Dank, es scheint, dass Ihre Lösung funktioniert. –