繁体   English   中英

如何获取当前持有的变体类型,并定义该类型的新变量

[英]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::getboost::apply_visitor或其他方法访问它)。

如果您想对您拥有的任何变体执行操作,并且所有操作看起来都相同,只有它们的类型不同(它们相同,因为类型不同,它们看起来相同),并且您想要避免多次编写相同的东西,当然模板是你的朋友。 boost::apply_visitortemplate<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM