c ++ Получение вершинных свойств Boost :: Graph - PullRequest
3 голосов
/ 02 августа 2011

Учитывая Вершины как:

class VertexProps {
  public:
    int id;
    float frame;
    string name;
};

Я инициализировал свой график повышения, используя связанные свойства.Я знаю, что могу получить кадр, используя:

std::cout << "Vertex frame: " << boost::get(&VertexProps::frame, graph, vertex) << std::endl;
//Need to make this work: float frame = boost::get(&VertexProps::frame, graph, vertex);
//graph is a boost::adjacency_list and vertex is a boost::vertex_descriptor

Однако я хочу написать более общую функцию или оболочку, такую:

std::vector<float> frames;
std::string prop_name = "frame";
float frame = graph.get_vertex_prop(vertex, prop_name);
frames.push_back(frame);

Я надеялся на что-то влинии:

typedef boost::variant< int, unsigned int, float, std::string > PropValType;
typedef boost::vertex_bundle_type<Graph>::type PropIdType;
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;

PropValType get_vertex_prop(Vertex& v, PropIdType pname)
{
  boost::get(pname, graph, v);
  //If pname = frame then return value as float (or cast boost::variant to float)
  //If pname = name then return value as a string
}

Я хочу избежать чего-то вроде:

PropValType get_vertex_prop(Vertex& v, std::string pname) {
 if (pname == "frame") {
   boost::get(&VertexProps::frame, graph, v)
   //return value as float
 }
 if (...)
}

1 Ответ

2 голосов
/ 04 августа 2011

Нет способа сделать это без какой-либо макро магии во время компиляции. C ++ не допускает строковые литералы в качестве нетиповых параметров шаблона и имеет очень тонкие возможности отражения.

Решение, которое вы предлагаете (и хотите избежать), требует некоторой работы во время выполнения и, как правило, его следует избегать.

Макро-решение будет выглядеть следующим образом:

#define MY_GET(v, pname) boost::get(&VertexProps##pname, graph, v)
PropValType v = MY_GET(v, frame);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...