我对C / C ++还是很陌生,通常,我使用C#编写代码,所以我有一个问题:
enum PrimitiveType {
BOOL,
STRING,
INT8,
INT16,
INT32,
UINT8,
UINT16,
UINT32,
};
struct MyValue
{
public:
String Id
PrimitiveType ValueType;
[???] Value;
};
我想在该int
属性中存储string
,bool
和"Value"
。
在C#中,我将Value
声明为对象,然后将该对象转换为int
或bool
,如:
if(myValueObject.ValueType == BOOL)
auto value = (bool)myValueObject.ValueType;
我可以在C ++中使用哪种类型?
答案 0 :(得分:5)
对此的规范答案是std::variant
。但是,我将摆脱那个枚举,因为它引入了多个事实来源:
using PrimitiveValue = std::variant<bool, String, int8_t, int16_t, int32_t, uint8_t, uint16_t, uint32_t>;
struct MyValue {
String id;
PrimitiveValue val;
};
如果您绝对需要产生该枚举值,则需要一个映射:
PrimitiveType MyValue::getPrimitiveType() const {
if (val.holds_alternative<bool>()) { return BOOL; }
else if (val.holds_alternative<String>()) { return STRING; }
else if (val.holds_alternative<int8_t>()) { return INT8; }
// else ...
}
以这种方式进行操作可确保永远不会发生类型描述符与实际存储的值不匹配的状态,因为variant
保证了这一点。
话虽这么说,在这种价值上行动的“ C#方式”并不是这里的最佳选择。更好的一个是std::visit
,它与该页面上的overloaded
助手一起可以生成真正简洁的代码,根据所存储的值而有所不同。
答案 1 :(得分:1)