【问题标题】:c++ Getting vertex properties of a Boost::Graphc++ 获取 Boost::Graph 的顶点属性
【发布时间】:2011-08-01 23:11:13
【问题描述】:

给定一个顶点为:

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 (...)
}

【问题讨论】:

    标签: c++ boost graph properties


    【解决方案1】:

    在编译时没有任何宏魔法是无法做到这一点的。 C++ 不允许字符串字面量作为非类型模板参数,并且反射能力非常弱。

    您提出(并希望避免)的解决方案需要在运行时进行一些工作,通常应该避免。

    宏观解决方案将遵循这些思路:

    #define MY_GET(v, pname) boost::get(&VertexProps##pname, graph, v)
    PropValType v = MY_GET(v, frame);
    

    【讨论】:

    • 好吧,我已经让自己相信了这个事实。但是有没有办法转换为正确的类型?我试过 float frame = *static_cast(boost::get(&VertexProps::pname, graph, v))
    • 我不明白你。 boost::get(&amp;VertexProps::pname, graph, v) 已经返回 float。有什么要投的?
    • 你是对的。累了;编译器告诉我“从 'void*' 到 'float' 的转换无效;我读错了行号。
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2016-03-11
    相关资源
    最近更新 更多