[英]How to get currently held variant type, and define new variables of that type
我有一个boost::variant
类型,例如:
typedef boost::variant< uint8_t, int8_t, uint16_t, int16_t,
uint32_t, int32_t, float, double, std::string > StorageTt;
一个StorageTt
变量,比如val
,在我的代码后面被设置为这些存储类型之一。 我想检索val
当前保存的类型以定义更多相同类型的变量。 因此,如果val
当前是uint16_t
,我想执行以下操作:
typedef decltype(typeid(val)) StorageTt;
StorageTt new_val = 42; // new_val should be a uint16_t
但这会产生一个const type_info
类型。 我知道我可以做到:
switch (val.which()) {
case 0: // uint8_t
case 1: //...
但我宁愿避免使用长的 switch 语句,因为我必须多次执行此操作。
你不能这样做。 变量是句法结构。 它们是程序对象的名称。 名称仅存在于源代码中。
工作流程如下。 首先你写源码。 然后编译它,运行程序,它会执行一些操作,例如,从boost::variant
对象中检索一个值。 此时您无法定义任何名称。 没有来源,没有名称,没有语法。 只有对象。
如果您需要一个与从变体中检索到的对象类型相同的新对象,则StorageT new_val(val);
创建只是这样(新对象隐藏在new_val
,您可以使用boost::get
或boost::apply_visitor
或其他方法访问它)。
如果您想对您拥有的任何变体执行操作,并且所有操作看起来都相同,只有它们的类型不同(它们不相同,因为类型不同,它们看起来相同),并且您想要避免多次编写相同的东西,当然模板是你的朋友。 boost::apply_visitor
与template<typename> operator()
是正确的:
struct my_assignment_visitor: public boost::static_visitor<>
{
template <typename T> void operator()(T & var, double val) const
{
var = val;
}
};
boost::apply_visitor(my_assignment_visitor(), new_val, 32.0);
您可以使用带有调用运算符模板的访问者函子来执行类似的操作:
struct MyVisitor : public boost::static_visitor<>
{
template <typename StorageT>
void operator()(const StorageT&) const
{
StorageT new_val = 32; // declare variable with same type
doSomethingWith(new_val); // do something with it
}
};
像这样将它应用到变体val
:
boost::apply_visitor(MyVisitor(), val);
参考:
我不知道用 C++14 泛型 lambda 替换函子的方法。
使用复制构造函数应该可以:
// construct object of same type as val
StorageT new_val(val);
boost::get(new_val) = 32.0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.