2015-11-19 4 views
1

Этот вопрос касается Boost Graph Library.BGL: связанный объект без конструктора по умолчанию?

Предположим, что мой тип графа определяется следующим образом:

using Graph = boost::adjacency_list<vecS, setS, directedS, State>; 

Теперь, если я правильно понимаю, я могу добавить новый State объект s на графике, как это:

auto vd = add_vertex(g); // g is a Graph object 
g[vd] = s; 

Там являются две проблемы следующим образом:

  • для этого требуется State, чтобы иметь конструктор по умолчанию. В случае этого конкретного класса State конструктор по умолчанию просто не имеет смысла.

  • Таким образом, я плачу за строительство по умолчанию объекта State при добавлении вершины. Эта стоимость является чистой накладной.

Итак, существует ли способ избежать необходимости создания конструктора по умолчанию для связанных объектов?

ответ

1

documentation:

типов всех значений свойств должен быть Copy конструктивизируемым, назначаемым, и по умолчанию построимого. Карты свойств, полученные из класса adjacency_list, являются моделями концепции Lvalue Property Map. Если adjacency_list const, то отображение свойства является постоянным, иначе отображение свойства изменчиво.

Вы должны сделать тип недвижимости, который способен проведение или ссылки ваши State.

Для самого первого шага вы могли бы иметь успех с перегрузкой, которая принимает свойство:

auto vd = add_vertex(s, g); // g is a MutablePropertyGraph object 
g[vd] = s; 

Смотреть другие docs

+0

ли вам все еще нужно 'г [VD] = s'? Кроме того, мой тип «Graph» подходит для использования с этой перегрузкой? – AlwaysLearning

+0

Вы можете просто посмотреть в связанной документации. Но да, это должно быть применимо. Однако требования к типу собственности не изменяются, поэтому рассмотрим систематический снимок. – sehe

Смежные вопросы