【发布时间】:2012-12-04 14:27:43
【问题描述】:
什么是可取的(如果有的话)?
变体 A(巴顿-纳克曼):
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); }
【问题讨论】:
-
我个人更喜欢前者。
equal_comparable可以放入合适的命名空间,但谁知道成员use_my_equal被某种类型的T用于你从未听说过的。当然,这个问题适用于enable_if的其他类似用途——仅仅因为解析依赖名称并不必然意味着该名称用于您认为的含义,如果您正在提取它在您无法控制的命名空间之外。您可以改用类型特征。 -
为什么要使用模板?为什么不只是
bool operator==(const MyClass&, /* etc */);? -
@GManNickG:我相信这个技巧的目的是减少每个类所需的样板文件,这是平等可比的。
-
@SteveJessop:哦,对了。从来不是粉丝。 :)
-
@GManNickG:Boost 运算符更有说服力,因为运算符重载中的实际信息需要重用。它们不纯粹是为了将每个运算符转发给一个相应的成员函数。
标签: c++ operator-overloading template-meta-programming c++-concepts