2017-07-24 120 views
1

执行转换有一种方法,以实现用C是这样++:模板功能:基于类型名称

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

假设结果变量类型总是已知的(在这种情况下字符串)。返回类型是在函数调用模板,例如:

int x = function<int>(); 

我知道,有些事情就像std::is_integralstd::is_same定义。通过这些函数,我可以确定T的类型。但它似乎不起作用,因为它在编译期间无法进行评估,因此编译器会引发错误。

+0

您可以使用'stringstream'。 – mch

+0

你可以使用'如果constexpr(blah){blah}',但stringstream可能更好。 – HolyBlackCat

+0

stringstream解决方案似乎工作,谢谢。你想写一个答案,所以我可以接受它吗? – CatPlusPlus

回答

1

你可以使用一个stringstream

#include <sstream> 

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

检查这是否适用于包含空格的字符串'result'。字符串提取停在空白处, – Arkadiy

1

可以使用SFINAE函数模板的两个版本之间的区别。

#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'; 
} 

在C++ 14 auto返回类型和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'; 
}