Vielleicht könnten Sie den folgenden Hack verwenden. Aufgrund dieser einfachen Art Merkmale:
template<bool b, typename T, typename U>
struct conditional { typedef T type; };
template<typename T, typename U>
struct conditional<false, T, U> { typedef U type; };
template<typename T, typename U>
struct is_same { static const bool value = false; };
template<typename T>
struct is_same<T, T> { static const bool value = true; };
Sie können Ihre Klasse und Fachelementfunktion wie folgt schreiben:
class ReturnTypeSpecialization
{
public:
template<typename T>
typename conditional<is_same<T, float>::value, int, T>::type
Item();
};
// Normally just return the template type
template<typename T>
typename conditional<is_same<T, float>::value, int, T>::type
ReturnTypeSpecialization::Item() { return T(); }
// When a float is specified, return an int
template<>
int ReturnTypeSpecialization::Item<float>() { return 1.0f; }
Einfache Testprogramm (verwendet C++ 11 nur für Überprüfung):
int main()
{
ReturnTypeSpecialization obj;
static_assert(std::is_same<decltype(obj.Item<bool>()), bool>::value, "!");
static_assert(std::is_same<decltype(obj.Item<float>()), int>::value, "!");
}
Hier ist ein live example.
Was versuchen Sie zu erreichen? – didierc
Ich möchte, dass eine Funktion den Typ zurückgibt, der als Vorlageargument bereitgestellt wird, außer in einem speziellen Fall möchte ich, dass die Funktion einen anderen Typ zurückgibt. –
Nur für den Datensatz: Wenn das Template-Argument vom Typ eines Arguments abgeleitet und nicht explizit angegeben wird, ist es einfacher, einen anderen Typ zurückzugeben, indem Sie eine Funktionsüberladung verwenden. (Natürlich wird das in diesem Beispiel nicht funktionieren, da es keine Argumente gibt) – jorgbrown