从 c++ / c++11 中的函数返回不同值类型的优雅方法
Elegant way to return different value types from function in c++ / c++11
我正在寻找堆栈流,以最好的方式从 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) };
}
要在评论中回答您的问题:
聚合
{std::to_string(value)}
初始化一个Value
对象,即函数的返回值。对任何
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;
}
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 调用具有未标识类型的类的方法
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 我的模板类方法返回错误类型?
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 构造智能点数据类型以及普通数据类型的通用方法
- 如何在没有实例的情况下获取非静态方法的类型?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 使用类型id运算符的最佳替代方法
- Java 调用 dll 字符串返回类型方法
- C++ 如何绑定和调用模板化类型方法
- 将返回类型推断为模板参数类型方法
- 返回true的模板化类型方法是在条件中进行优化的良好候选者