ich die folgende Template-Funktion geschrieben, die ein willkürlicher Behälter überprüft, ob ein bestimmtes Element enthält:wenn klassenspezifische Memberfunktion hat
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;
}
Das funktioniert gut für die meisten Container. Doch für alle Arten von Sätzen (und Karten) ist suboptimal, da könnten wir verwenden:
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;
}
Natürlich sind wir nicht beide Vorlagen gleichzeitig wegen Mehrdeutigkeit verwenden können. Jetzt suche ich nach einer Möglichkeit, std::enable_if
zu verwenden, um die erste Vorlage zu aktivieren, wenn container_t
keine count
Mitgliedsfunktion und die zweite Vorlage, wenn dies der Fall ist. Ich kann jedoch nicht herausfinden, wie Sie nach einer bestimmten Elementfunktion suchen (mit C++ 11).
Wenn Sie bereit sind, Boost als Abhängigkeit hinzuzufügen, dann hat [boost.TTI] (http://www.boost.org/doc/libs/1_57_0/libs/tti/doc/html/index.html) was Sie suchen im '' BOOST_TTI_HAS_MEMBER_FUNCTION'' Makro –
Sind Sie absolut sicher, dass Sie das tun möchten? In der Standardbibliothek können Sie genau festlegen, welche "Find" -Form Sie explizit verwenden möchten, wenn Sie eine lineare Suche durchführen und einen effizienteren Mechanismus verwenden. Als Randnotiz, wenn Sie dies wirklich tun wollen, verwenden Sie definitiv 'find' anstelle von' count', es vermeidet nur vorzeitige Pessimierung. –
@SimonGibbons: Danke, es sieht so aus, wie ich es brauche. Allerdings würde ich es vorziehen, im Moment nicht von Boost abhängig zu sein. – Haatschii