模板功能:根据typename执行转换

时间:2017-07-24 19:02:46

标签: c++ oop templates

有没有办法在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的类型。但它似乎不起作用,因为它无法在编译期间进行评估,因此编译器会抛出错误。

2 个答案:

答案 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';
}