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();
}