2017-07-24 2 views
1

Gibt es eine Möglichkeit etwas wie dies in C++ zu erreichen:Template-Funktion: durchführt Umwandlung basierend auf Typnamen

template<typename T> 
T function() 
{ 
    std::string result = getRes(); 
    // if (type == string) 
     return result; 
    // else if (type == numeric) 
     return std::stoul(result, nullptr); 
} 

das Ergebnis Variablentyp (in diesem Fall string) ist immer bekannt Angenommen. Der Rückgabetyp wird durch die Vorlage in dem Funktionsaufruf, z.B .: definiert

int x = function<int>(); 

Ich weiß, dass es Dinge gibt, wie std::is_integral oder std::is_same. Mit diesen Funktionen konnte ich den Typ von T bestimmen. Es scheint jedoch nicht zu funktionieren, da es während der Kompilierzeit nicht ausgewertet werden kann und daher der Compiler Fehler auslöst.

+0

Sie können einen 'stringstream' verwenden. – mch

+0

Sie könnten 'if constexpr (blah) {blah}' verwenden, aber der Stringstream ist wahrscheinlich besser. – HolyBlackCat

+0

Die Stringstream-Lösung scheint zu funktionieren, danke. Willst du eine Antwort schreiben, damit ich sie annehmen kann? – CatPlusPlus

Antwort

1

können Sie verwenden ein stringstream:

#include <sstream> 

template<typename T> 
T function() 
{ 
    std::string result = getRes(); 
    stringstream ss; 
    ss << result; 
    T value; 
    ss >> value; 
    return value; 
} 
+1

Überprüfen Sie, ob dies für einen String 'result' funktioniert, der Leerzeichen enthält. String-Extraktion stoppt bei Leerzeichen, – Arkadiy

1

Sie SFINAE verwenden können zwischen zwei Versionen einer Funktion Vorlage zu unterscheiden.

#include <iostream> 
#include <string> 
#include <type_traits> 

std::string getRes() { return "1729"; } 

template < typename T, typename std::enable_if< std::is_same<T,std::string>::value, void** >::type = nullptr > 
std::string function() 
{ 
    return getRes(); 
} 

template < typename T, typename std::enable_if< std::is_arithmetic<T>::value, void** >::type = nullptr > 
unsigned long function() 
{ 

    return std::stoul(getRes()); 
} 

int main() 
{ 
    unsigned long ul = function<unsigned long>(); 
    std::string s = function<std::string>(); 

    std::cout << ul << ' ' << s << '\n'; 
} 

etwas kürzer in C++ 14 mit auto Rückgabetyp und enable_if_t.

#include <iostream> 
#include <string> 
#include <type_traits> 

std::string getRes() { return "1729"; } 

template < typename T, std::enable_if_t< std::is_same<T,std::string>::value, void** > = nullptr > 
auto function() 
{ 
    return getRes(); 
} 

template < typename T, std::enable_if_t< std::is_arithmetic<T>::value, void** > = nullptr > 
auto function() 
{ 

    return std::stoul(getRes()); 
} 

int main() 
{ 
    unsigned long ul = function<unsigned long>(); 
    std::string s = function<std::string>(); 

    std::cout << ul << ' ' << s << '\n'; 
} 
Verwandte Themen