Есть два способа прочитать вопрос:
Мой вопрос таков: не могу ли я установить некоторые свойства
Не в том смысле, что они не могут отсутствовать.Тип пучка - это единица измерения.
все ли они должны быть установлены при создании ребра?
Ну нет.Это C ++.В вашем примере не «установка» их всех оставит их в их неопределенных значениях.Для не примитивного типа применяется инициализация по умолчанию (скажем, std::string
всегда получит значение по умолчанию ""
).
Чтобы предотвратить неопределенные данные, вы можете просто обеспечить инициализацию, либо добавив конструктор по умолчанию:
struct EdgeProperty {
double weight;
int index;
int property_thats_only_used_sometimes;
bool property_thats_only_used_sometimes2;
EdgeProperty()
: weight(1.0), index(-1),
property_thats_only_used_sometimes(0),
property_thats_only_used_sometimes2(false)
{ }
};
или эквивалентно с использованием NSMI:
struct EdgeProperty {
double weight = 1.0;
int index = -1;
int property_thats_only_used_sometimes = 0;
bool property_thats_only_used_sometimes2 = false;
};
Расширенные идеи
Возможно, вы не знаете, но вы также можете передавать свойства непосредственно в add_edge
.Если вы хотите, вы можете предоставить подходящий конструктор, который будет принимать только обычно задаваемые свойства:
struct EdgeProperty {
double weight;
int index;
EdgeProperty(double w = 1.0, int i = -1) : weight(w), index(i)
{ }
int property_thats_only_used_sometimes = 0;
bool property_thats_only_used_sometimes2 = 0;
};
Теперь вы можете просто создать ребро:
auto edge = add_edge(u, v, EdgeProperty(5, 1), graph).first;
Live Demo
Live On Coliru
#include <boost/graph/adjacency_list.hpp>
struct EdgeProperty {
double weight;
int index;
EdgeProperty(double w = 1.0, int i = -1) : weight(w), index(i)
{ }
int property_thats_only_used_sometimes = 0;
bool property_thats_only_used_sometimes2 = 0;
};
using Graph = boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, boost::no_property, EdgeProperty>;
int main() {
Graph graph;
auto u = add_vertex(graph);
auto v = add_vertex(graph);
//would this be enough:
auto edge = add_edge(u, v, EdgeProperty(5, 1), graph).first;
}