Wang's blog

c++统一函数接口返回不同类型的值

Published on

假设存在以下函数:

int get_int();
float get_float();
std::string get_string();

想要将其整合为一个函数get_value(),根据需要返回不同类型的数据。

尝试使用函数模板,在函数中根据数据类型执行不同的操作:

template <typename T>
T get_value()
{
    T ret;
    if (std::is_same<T, int>::value)
        ret = get_int();
    else if (std::is_same<T, float>::value)
        ret = get_float();
    else if (std::is_same<T, std::string>::value)
        ret = get_string();
    return ret;
}

然而这样会出现编译错误。这是由于在实际使用时,编译器会根据T的实际类型将模板实例化为一个普通函数,例如当T为int时,实例化的函数为:

int get_value()
{
    int ret;
    if (std::is_same<int, int>::value)
        ret = get_int();
    else if (std::is_same<int, float>::value)
        ret = get_float();
    else if (std::is_same<int, std::string>::value)
        ret = get_string();
    return ret;
}

此时两个else if语句中的代码虽然永远不会执行,但是它们却不能通过编译。因此此方法无效。

最终采用重载的方式解决此问题。由于返回值类型不能用于区别重载函数,因此需要将待返回值的引用作为参数传入:

void get_value(int &ret)
{
    ret = get_int();
}

void get_value(float &ret)
{
    ret = get_float();
}

void get_value(std::string &ret)
{
    ret = get_string();
}