繁体   English   中英

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

[英]Getting/deducing type in template-function for 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类,此模板参数很容易找出,因为它是在创建Graph对象时定义的。
但是对于FilteredGraph,它应该能够从GRAPH-template参数推导出来。
再说一遍,我认为编译器仍然会在获取正确的返回值类型方面遇到问题,因为这可能是事先需要了解的...
我真的很想将这个概念与properties()函数保持一致,因为它允许保持其他函数通用。
您是否有解决该问题的想法,并可能保留该想法?

再次,我很抱歉没有提供更多信息。
在我看来,编译器无法在此处推断出依赖类型。 在使用模板之前,我曾几次遇到此问题。
如果有人遇到类似问题,我将在此处提供修复程序。

FilteredGraph使用Graph的实例(基本上是具有内部自定义属性的adjacency_list)作为其输入。 Graph类具有两个模板参数,一个用于顶点的属性,一个用于边的属性。
作为一点说明,使用捆绑属性(boost图形库的较早版本不支持,某些编译器也不支持),我认为,可以避免此问题,因为您不需要额外的函数来返回a值(可能)类型未知。 因为需要为某些特定类型的顶点/边属性指定传递给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]);
}

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

最好的祝福。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM