Я написал следующую функцию шаблона, которая проверяет, содержит ли суровый контейнер определенный элемент:
template<template<class, class...> class container_t, class item_t, class... rest_t>
bool contains(const container_t<item_t, rest_t...> &_container, const item_t &_item) {
for(const item_t &otherItem : _container) {
if(otherItem == _item) { return true; }
}
return false;
}
Это хорошо работает для большинства контейнеров. Однако для всех видов множеств (и карт) оно является оптимальным, поскольку мы могли бы использовать:
template<template<class, class...> class set_t, class item_t, class... rest_t>
bool contains(const set_t<item_t, rest_t...> &_set, const item_t &_item) {
return _set.count(_item) > 0;
}
Очевидно, мы не можем использовать оба шаблона одновременно из-за неоднозначности. Теперь я ищу способ использовать std::enable_if
, чтобы включить первый шаблон, если container_t
не предоставляет функцию-член count
и второй шаблон, если это так. Однако я не могу понять, как проверить определенную функцию-член (используя С++ 11).