ho scritto la seguente funzione del modello, che verifica se un contenitore arbitrario contiene un elemento specifico:Abilita funzione di modello se classe ha la funzione di membro specifica
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;
}
Questo funziona bene per la maggior parte dei contenitori. Tuttavia, per tutti i tipi di insiemi (e mappe) è sub ottimale poiché ci si potrebbe usare:
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;
}
Ovviamente non possiamo utilizzare entrambi i modelli contemporaneamente causa di ambiguità. Ora sto cercando un modo per utilizzare std::enable_if
per consentire il primo modello a se container_t
non fornisce una funzione count
membro e il secondo modello se lo fa. Tuttavia non riesco a capire come controllare una funzione membro specif (usando C++ 11).
Se siete disposti ad aggiungere spinta come una dipendenza, quindi [boost.TTI] (http://www.boost.org/doc/libs/1_57_0/libs/tti/doc/html/index.html) ha ciò stai cercando nella macro '' BOOST_TTI_HAS_MEMBER_FUNCTION'' –
Sei assolutamente sicuro di volerlo fare? Nella libreria standard ti fanno capire esattamente quale forma di 'find' vuoi usare per renderla esplicitamente chiara quando stai facendo una ricerca lineare e quando usi un meccanismo più efficiente. Come nota a margine se vuoi davvero farlo, usa sicuramente 'find' invece di' count', evitando semplicemente una pessimizzazione prematura. –
@SimonGibbons: Grazie, sembra quello di cui ho bisogno. Comunque preferirei non dipendere da boost al momento. – Haatschii