Вы можете получить тип через черту property_map
. Фактически тип-значения является признаком карты этого свойства:)
Итак, чтобы обнаружить расслоение вершин:
template <typename Graph, typename Bundle = typename boost::property_map<Graph, boost::vertex_bundle_t>::type>
using VBundle = typename boost::property_traits<Bundle>::value_type;
Делаем это более читабельным с пробелами:
template <
typename Graph,
typename Bundle =
typename boost::property_map<Graph, boost::vertex_bundle_t>::type>
using VBundle =
typename boost::property_traits<Bundle>::value_type;
Вы можете видеть, что мы запрашиваем property_traits
карты свойств vertex_bundle_t
.
Чтобы проверить, что это ожидаемый тип:
template <typename Graph>
using HasVertexProp = std::is_same<VertexProp, VBundle<Graph> >;
Теперь вы можете использовать SFINAE. Или, как я предположил бы для случая, подобного этому: отправка тега;
namespace detail {
template <typename Graph_t>
void foo(const Graph_t& g, std::true_type) {
print_graph(g, std::cout << "Graph with VertexProp bundle: ");
}
template <typename Graph_t>
void foo(const Graph_t& g, std::false_type) {
print_graph(g, std::cout << "Graph with other/missing properties: ");
}
}
template <typename Graph_t>
void foo(const Graph_t& g) {
detail::foo(g, HasVertexProp<Graph_t>{});
}
Давайте проверим это:
Live On Coliru
int main() {
graph1_t g1(4);
graph2_t g2(4);
foo(g1);
foo(g2);
}
Отпечатки
Graph with VertexProp bundle: 0 <-->
1 <-->
2 <-->
3 <-->
Graph with other/missing properties: 0 <-->
1 <-->
2 <-->
3 <-->