如何为模板化类检索boost :: variant值

时间:2016-12-01 14:44:09

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

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

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

存储在

std::map<string,dataVar> 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());
  }

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

我看过其他提出访问者设计的回复,但我还需要数据类型&lt;&gt;得到这个项目。

1 个答案:

答案 0 :(得分:4)

假设data<A>data<B>都具有相同的界面,您可以将访问者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

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