簡體   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