获取/推断模板函数中的类型以获取返回值

时间:2010-11-17 10:34:07

标签: c++ templates boost return-value

我正在使用Boost Graph Library并在此基础上构建我自己的类。

现在,我有以下功能:

template< class VERTEXPROPERTIES >
VERTEXPROPERTIES& properties(const Vertex& v) const
{   
    typename property_map<FilteredGraphContainer, vertex_properties_t>::const_type param = get(vertex_properties, graph_);

    return param[v];
}

当我在这样的类模板中使用此函数时:

template< class VERTEXPROPERTIES, class EDGEPROPERTIES >
class Graph
{
// all the code
};

它有效。 但是,当我想在类这样的类中使用它时:

template < class GRAPH, class EDGE_PREDICATE, class VERTEX_PREDICATE >
class FilteredGraph
{
// all the code
};

并将properties()函数应用于FilteredGraph对象,编译器抱怨它无法找到该函数。
据我所知,到目前为止,这可能是由于参数列表中缺少模板参数 对于Graph-class,这个模板参数很容易找到,因为它在创建Graph-object时被定义 但对于FilteredGraph,它应该能够从GRAPH-template参数中推断出它 然后,我认为编译器在获取正确的返回值类型时会遇到问题,因为事先可能需要这样做才能找到... 我真的希望将这个概念与properties()函数保持一致,因为它允许保持其他函数的通用性 您对如何解决该问题有任何想法,可能保留这个概念吗?

1 个答案:

答案 0 :(得分:0)

再次,我对没有提供更多信息表示歉意 在我看来,编译器无法在那里推断出依赖类型。在使用模板之前,我曾经遇到过这个问题 我会在这里提供修复,以防有人遇到类似的问题。

FilteredGraph使用Graph的实例(基本上是带有内部自定义属性的adjacency_list)作为输入。 Graph-class有两个模板参数,一个用于顶点的属性,另一个用于边的属性 作为一个小小的注释,使用捆绑属性(不受旧版本的boost图库支持,也不受某些编译器支持),我认为,这个问题可以被规避,因为你不需要额外的函数返回一个值(可能)未知类型。 因为需要为某些特定类型的顶点/边缘属性指定传递给FilteredGraph的Graph对象,所以实际上可以提取此信息。
我通过以下方式实现了这一目标:

/// Type of the internal properties of the edges
typedef typename property_traits< typename property_map<FilteredGraphContainer, vertex_properties_t>::type >::value_type VProps;
/// Type of the internal properties of the edges
typedef typename property_traits< typename property_map<FilteredGraphContainer, edge_properties_t>::type >::value_type EProps;

然后定义:

VProps& properties(const Vertex& v)
{
        typename property_map<FilteredGraphContainer, vertex_properties_t>::type param = get(vertex_properties, graph_);
        return (param[v]);
}

再次感谢您对此问题的关注,我很抱歉没有提供更多信息。

最好的问候。