【问题标题】:boost::variant - get vector property of membersboost::variant - 获取成员的向量属性
【发布时间】:2016-05-11 14:48:52
【问题描述】:

我被困住了:)。我有两级层次结构,每个级别都有子节点。 目标是使用这个结构来填充 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;
}

【问题讨论】:

    标签: c++ boost apply visitor-pattern


    【解决方案1】:

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

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

    Live On 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;
    }
    

    【讨论】:

    • 非常感谢!与您的评论有关的问题:您将 lst() 的返回参数更改为 std::vector<:shared_ptr> > 示例中的 B 类具有指向 A 的共享指针的此列表返回向量。我没有看到如果容器返回指向基类的指针,如何确定容器中元素的类型。
    • 嗯。 operator() 显然已经返回了。如果您坚持,您只能转换并返回副本...:demo。到目前为止,我认为您需要下定决心:您需要静态多态来做什么,以及为什么需要动态多态。
    • 后者与变体无关:见dynamic_castdynamic_pointer_cast。此外,如果您需要不同的返回类型,这意味着您不能只有一个访问者。你当然可以返回......另一个变体(uhoh):like so,但对我来说这似乎是一个相当大的code smell
    • 我正在尝试创建一个树结构来替换我的 Qt 代码以用于树视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多