boost::variant-获取成员的向量属性



我被卡住了:)。我有两个层次结构,每个层次都有子节点。目标是使用这个结构来填充gui树。我正在尝试以通用方式访问变体成员的子节点。以下代码未使用vs2013进行编译。我会感谢你的帮助和/或建议关于设计变更。

#include "stdafx.h"
#include <memory>
#include <string>
#include <vector>
#include <boost/variant.hpp>
class base {};
class A : public base
{
public:
    std::vector<std::shared_ptr<base>> & lst(){ return _lst; }
private:
    std::vector<std::shared_ptr<base>> _lst;
};
class B : public base
{
public:
    std::vector<std::shared_ptr<A>>& lst() { return _lst; }
private:
    std::vector<std::shared_ptr<A>> _lst;
};
using bstvar = boost::variant<A, B>;
class lstVisitor : public boost::static_visitor<>
{
public:
    template <typename T> std::vector<std::shared_ptr<base>>& operator()  (T& t) const
    {
        return t.lst();
    }
};
int _tmain(int argc, _TCHAR* argv[])
{
    bstvar test;
    auto& lst= boost::apply_visitor(lstVisitor{}, test);
    return 0;
}

您的访问者有一个隐含的返回类型void(缺少模板参数)。

这里有机会删除基类,因为在大多数c++11代码库中不再需要它:

在Coliru上直播

#include <memory>
#include <string>
#include <vector>
#include <boost/variant.hpp>
class base {};
using base_vec = std::vector<std::shared_ptr<base> >;
class A : public base {
  public:
    base_vec &lst() { return _lst; }
  private:
    base_vec _lst;
};
class B : public base {
  public:
    base_vec &lst() { return _lst; }
  private:
    base_vec _lst;
};
using bstvar = boost::variant<A, B>;
struct lstVisitor {
    using result_type = base_vec&;
    template <typename T> result_type operator()(T &t) const { return t.lst(); }
};
int main(int argc, char *argv[]) {
    bstvar test { B{} };
    base_vec& lst = boost::apply_visitor(lstVisitor{}, test);
    return 0;
}

相关内容

最新更新