Co jest lepsze (jeśli jest)?Barton-Nackman kontra std :: enable_if
Wariant A (Barton-Nackman):
template<class T>
struct equal_comparable {
friend bool operator == (const T & t1, const T & t2) {
return t1.equalTo (t2);
}
};
class MyClass : private equal_comparable<MyClass> {
bool equalTo (const MyClass & other) //...
};
Wariant B (std :: enable_if):
struct MyClass {
static const bool use_my_equal = true;
bool equalTo (const MyClass & other) //...
};
template<class T>
typename std::enable_if<
T::use_my_equal,
bool
>::type
operator == (const T & t1, const T & t2) { return t1.equalTo (t2); }
Osobiście wolę ten pierwszy. 'equal_comparable' może zostać umieszczony w odpowiedniej przestrzeni nazw, ale kto wie, do czego służy element' use_my_equal' przez jakiś typ 'T', o którym nigdy nie słyszałeś. Oczywiście ten problem dotyczy innych podobnych zastosowań 'enable_if' - tylko dlatego, że nazwa zależna rozwiązuje, niekoniecznie * oznacza, że nazwa jest używana dla tego, co Twoim zdaniem oznacza, jeśli usuwasz ją z przestrzeni nazw nie kontroluj. Zamiast tego możesz użyć cechy typu. –
Dlaczego warto korzystać z szablonu? Dlaczego nie po prostu 'operator bool == (const MyClass &,/* etc * /) ;?' – GManNickG
@GManNickG: Uważam, że celem tej sztuczki jest zmniejszenie wymaganej dla każdej klasy skali, która jest porównywalna pod względem równości. –