Получение / вывод типа в шаблоне-функции для возвращаемого значения - PullRequest
0 голосов
/ 17 ноября 2010

Я использую библиотеку графов ускорения и на этом строю свои собственные классы.

Теперь у меня есть следующая функция:

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 (), поскольку она позволяет сделать другие функции общими.
У вас есть идеи, как решить эту проблему, возможно, сохранив концепцию?

1 Ответ

0 голосов
/ 17 ноября 2010

Еще раз приношу свои извинения за то, что не предоставил больше информации. Мне показалось, что компилятор не смог вывести там зависимый тип. Я сталкивался с этой проблемой несколько раз раньше при работе с шаблонами.
Я предоставлю исправление здесь на случай, если кто-то может столкнуться с подобными проблемами.

FilteredGraph использует экземпляр Graph (в основном, adjacency_list с внутренними пользовательскими свойствами) в качестве входных данных. В классе Graph есть два параметра шаблона: один для свойств вершин и один для свойств ребер.
Как небольшая заметка, использующая связанные свойства (не поддерживаемые более старой версией библиотеки графов надстроек, а также не некоторыми компиляторами), я думаю, что эту проблему можно обойти, поскольку вам не понадобится дополнительная функция, возвращающая значение (возможно) неизвестный тип. Поскольку объект Graph, переданный в FilteredGraph, необходимо указать для некоторых конкретных типов свойств вершин / ребер, эта информация может быть фактически извлечена.
Я достиг этого через:

/// 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]);
}

Еще раз спасибо за Ваш интерес к этому вопросу, и я сожалею, что не предоставил больше информации.

С уважением.

...