Бартон-Нэкман против std :: enable_if

Что предпочтительнее (если есть)?

Вариант А (Бартон-Нэкман):

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)  //...
};

Вариант 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); }

5

Решение

Я бы предпочел использовать Boost.Operators упоминается @SteveJessop в комментариях, что формализует и автоматизирует ваш первый подход. Они также позаботятся об оптимизации пустой базы, если вам понадобится несколько наборов операторов (и, следовательно, потребуется множественное наследование). Это не столько экономия при наборе текста, сколько ценность документации / исполнения кода, так как эти базовые классы находятся прямо перед интерфейсом класса. В этом смысле, это примитивный способ концепций.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector