[英]boost::variant - get vector property of members
我被困住了:)。 我有兩級層次結構,每級都有子節點。 目標是使用此結構來填充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代碼庫不再需要該基類:
#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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.