从 c++ / c++11 中的函数返回不同值类型的优雅方法

Elegant way to return different value types from function in c++ / c++11

本文关键字:类型 方法 返回 c++ c++11 函数      更新时间:2023-10-16

我正在寻找堆栈流,以最好的方式从 c++ 中的函数返回不同的值类型 我发现很少有很酷的方法,尤其是这种方法,它尽可能接近:
C++具有不同返回类型的相同函数参数

但是有问题. 值对象只能接受/强制转换字符串,所以如果我有这样的东西:

Value RetrieveValue(std::string key)
{
//get value
int value = get_value(key, etc);
return { value };
}

我得到 :

error C2440: 'return': cannot convert from 'initializer list' to 'ReturnValue'
no suitable constructor exists to convert from "int" to "std::basic_string<char, std::char_traits<char>, std::allocator<char>>" 

我的问题是我可以修改值对象以支持布尔、浮点数和整数吗?

struct Value
{
std::string _value;
template<typename T>
operator T() const   //implicitly convert into T
{
std::stringstream ss(_value);
T convertedValue;
if ( ss >> convertedValue ) return convertedValue;
else throw std::runtime_error("conversion failed");
}
}

另外,为什么在:{ value }
大括号中返回"值"?

std::string没有构造函数单独int。因此,您不能直接使用std::string初始化。

但是,您可以使用std::to_string编译它

Value RetrieveValue(std::string key)
{
//get value
int value = get_value(key, etc);
return { std::to_string(value) };
}

要在评论中回答您的问题:

  1. 聚合{std::to_string(value)}初始化一个Value对象,即函数的返回值。

  2. 对任何T的隐式转换发生在函数调用之外。当编译器需要将您返回的Value分配给某个变量时,它会寻找正确的转换。模板化转换运算符提供的内容。


根据您的第二条评论。如果你只想支持基本类型,你可以省去例外,转而支持std::is_fundamental上的static_assert

template<typename T>
operator T() const   //implicitly convert into T
{
static_assert(std::is_fundamental<T>::value, "Support only fundamental types");
std::stringstream ss(_value);
T convertedValue;
ss >> convertedValue
return convertedValue;
}
相关文章: