有没有办法在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_integral
或std::is_same
之类的内容。使用这些函数,我可以确定T的类型。但它似乎不起作用,因为它无法在编译期间进行评估,因此编译器会抛出错误。
答案 0 :(得分:1)
您可以使用stringstream:
#include <sstream>
template<typename T>
T function()
{
std::string result = getRes();
stringstream ss;
ss << result;
T value;
ss >> value;
return value;
}
答案 1 :(得分: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';
}
使用auto
返回类型和enable_if_t
的C ++ 14稍短一些。
#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';
}