Boost :: Вариант — получить векторное свойство членов

Я застрял :). У меня двухуровневая иерархия, у каждого уровня есть дочерние узлы.
Цель состоит в том, чтобы использовать эту структуру для заполнения графического дерева. Я пытаюсь получить доступ к дочерним узлам вариантов членов в общем виде. Следующий код не компилируется, используя 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;
}

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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]