Я использую BGL для построения графа, содержащего связанные вершины, где один тип вершины хранит ссылку на другой тип вершины.Оба типа обрабатываются с использованием std :: variable:
struct simple_node_t {
size_t enabled;
};
struct complex_node_t {
bool foo1;
size_t foo2;
simple_node_t& control;
};
using vertex_t = std::variant<simple_node_t, complex_node_t>;
using netListGraph_t = boost::adjacency_list<
boost::vecS,
boost::vecS,
boost::undirectedS,
vertex_t>;
Вершины типа complex_node_t создаются и хранятся следующим образом:
// Create node
complex_node_t cpx = {
true,
0xDEADBEEF,
std::get<simple_node_t>(mGraph[desc_to_simple_vertex])
};
// Add complex_node_t to graph
vertex_t vtx(cpx);
auto vertex = boost::add_vertex(vtx, mGraph);
Теперь проблема:
auto pVal = std::get_if<complex_node_t>(&mGraph[vertex]);
assert(pVal->foo1 == true); //OK
assert(pVal->foo2 == 0xDEADBEEF); //OK
Но получить доступ к ссылке не удается (недопустимый объект)!
**pVal->control.enabled -> GARBAGE**
Хранение данных по значению работает - но сохранение по ссылке - нет.
Что я делаю не так?
PS: Мой пример, конечно, очень сокращен ... это означает, что вершины, которые я хочу сохранить по ссылке, намного больше.
РЕДАКТИРОВАТЬ
Я сейчасизменил мой код:
struct complex_node_t {
bool foo1;
size_t foo2;
std::reference_wrapper<simple_node_t> control;
};
и попробуйте получить доступ к элементам:
if (pVal->control.get().enabled) -> **STILL GARBAGE**