【问题标题】:How to retrieve a boost::variant value for a templated class如何检索模板类的 boost::variant 值
【发布时间】:2016-12-01 14:44:08
【问题描述】:

我正在尝试使用 c++11 中的 boost::variant 来创建它,但我不确定如何。 所以我有模板类数据的这种结构

typedef boost::variant< data<A>,data<B>> dataVar;

存储在一个

std::map&lt;string,dataVar&gt; dataMap

如果我能以某种方式检索数据的类型,这样我就可以分配值,但我不知道如何优雅地完成这项工作

void registerDataFor(string str)
  {
     auto itr = dataMap.find(str);

    if(itr == dataMap.end())
        return;

     dataVar = itr->second;
     data<v.which()> itemData= boost::get<v.which()>(v);
     someArray.push_back(itemData.getIntegerValue());
     registerDataFor(itemData.getString());
  }

由于模板括号需要静态类型,因此无法编译。

我看到了其他提出访问者设计的回复,但我还需要数据类型来获取项目。

【问题讨论】:

    标签: c++ c++11 templates boost boost-variant


    【解决方案1】:

    假设data&lt;A&gt;data&lt;B&gt; 具有相同的接口,您可以使用访问者structtemplate operator()

    struct registerImpl : boost::static_visitor<void>
    {
        template <typename T>
        void operator()(T& x) const
        {
            someArray.push_back(x.getIntegerValue());
            registerDataFor(x.getString());   
        }
    };
    

    void registerDataFor(std::string str)
    {
        auto itr = dataMap.find(str);
    
        if(itr == dataMap.end())
            return;
    
        registerImpl visitor;
        boost::apply_visitor(visitor, itr->second);
    }
    

    wandbox example


    在 C++14 中,您可以通过使用generic lambda就地访问变体

    void registerDataFor(std::string str)
    {
        auto itr = dataMap.find(str);
    
        if(itr == dataMap.end())
            return;
    
        boost::apply_visitor([](auto& x){
            someArray.push_back(x.getIntegerValue());
            registerDataFor(x.getString());      
        }, itr->second);
    }
    

    wandbox example


    (如果您对使用 lambda 和 C++14 功能的变体访问感兴趣,我已经写了两篇关于它的文章:part 1part 2。)

    【讨论】:

    • C++14 解决方案非常棒,我建议包括它,即使在 C++11 问题中也是如此。 :)
    猜你喜欢
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多