Ich habe einen Funktor, der auf einen Behälter des Typs wie so U
von Elementen des T
Typs arbeitetC++ bestimmen, ob ein Behälter :: finden hat()
template<typename T, template<typename...> class U>
class asserter
{
public:
asserter(U<T> &c) : container(c) { };
void operator()(T lhs)
{
CU_ASSERT(container.find(lhs) != container.end());
};
private:
U<T> &container;
};
, die ich als
std::set<std::string> a, c;
...
asserter<std::string, std::set> ass(c);
for_each(a.begin(), a.end(), ass);
verwenden könnte
Wo wir std::includes()
für den Moment ignorieren.
Das funktioniert gut, wenn der Container U::find()
definiert ist. Wenn nicht, würde ich gerne auf std::find()
zurückgreifen. Auf der anderen Seite würde ich lieber U::find()
über std::find()
verwenden, wenn es verfügbar ist.
In C++ 11 (oder 17 bei Bedarf) kann ich feststellen, ob U::find()
verfügbar ist (möglicherweise Beschränkung auf die STL) für U und wenn ja, verwenden Sie sonst std::find()
?
Eine nützlichere Antwort würde auch erklären, warum der Code funktioniert. Zum Beispiel habe ich eine Antwort erwartet, die SFINAE verwendet. Ist der 'declltype (...)' Teil eine SFINAE Technik in C++ 17 (ich denke diese Lambda-Ausdruckssyntax ist C++ 17)? Außerdem wird "int" verwendet, um zu erzwingen, dass diese Signatur Vorrang vor der "langen" Überladung hat? –
Ich habe eine Sorge, dass 'std :: find' für Gleichheit ist, während' std :: set :: find' etc für Äquivalenz ist. Müssen wir darüber nachdenken? –
@NickyC Ich weiß das * theoretisch * sie sind anders, aber wie oft ist das in der realen Welt der Fall? Ich denke, 'set' und' map' (und ihre 'Multi'-Cousins) sind die einzigen, in denen es darauf ankommt, 'unordered_set' und' unordered_map' sollten Gleichheit verwenden. –