Правила языка изменились с момента изобретения паттерна, хотя были приняты меры, чтобы не нарушать его. Другими словами, насколько я могу судить, он все еще работает, но по другим причинам, чем изначально. Я не думаю, что я бы основывал попытку размерного анализа на этом паттерне, так как думаю, что сегодня есть лучшие способы сделать это.
Я также думаю, что пример слишком тривиален, чтобы быть полезным. Как уже говорилось, создание экземпляра equal_comparable<value_type>
приводит к появлению operator==
и operator!=
для value_type
. Поскольку они не являются членами, не имеет значения, что наследование является частным, они по-прежнему могут быть выбраны при разрешении вызова. Просто трудно понять смысл этого примера. Допустим, однако, что вы добавили параметр шаблона в equal_comparable
и несколько других вещей:
template<typename U, typename V> class equal_comparable
{
friend bool operator==(U const &a, V const &b) { return a.equal_to(b); }
friend bool operator!=(U const &a, V const &b) { return !a.equal_to(b); }
};
class some_other_type
{
bool equal_to(value_type const& rhs) const;
};
class value_type
: private equal_comparable<value_type>, // value_type comparable to itself
private equal_comparable<some_other_type> // value_type comparable to some_other_type
{
public:
bool equal_to(value_type const& rhs) const;
bool equal_to(some_other_type const& rhs) const;
};
Отказ от ответственности: я понятия не имею, так ли это предполагается, что предполагается использовать, но я достаточно уверен, что это будет работать, как описано.