使用 barton-nackman 技巧:http ://en.wikipedia.org/wiki/Barton%E2%80%93Nackman_trick
template<typename T,typename S>
class AddEnabled{
friend int operator + (T const& t, const S & s) {
T temp(t);
return temp.add(s);
}
};
class MyClass: public AddEnabled<MyClass,int>{
public:
MyClass(int val):mVal(val){
}
int add(int s){
mVal+=s;
return mVal;
}
private:
int mVal;
};
这是另一个重载 << 运算符的示例:
template<typename T>
class OutEnabled {
public:
friend std::ostream& operator<<(std::ostream& out, T const& val) {
return static_cast<OutEnabled<T> const&>(val).ioprint(out);
}
protected:
template<typename U>
U& ioprint(U& out) const {
return static_cast<T const*>(this)->print(out);
}
};
要使用它,您可以让您的类从 OutEnabled 继承:
class MyClass: public OutEnabled<MyClass>{ ...
或者您可以定义一个哨兵对象,例如在 cpp 文件的匿名命名空间中
namespace{
OutEnabled<MyClass> sentry;
}
一旦模板 OutEnabled 被实例化 ( OutEnabled<MyClass>
),GLOBAL 运算符就std::ostream& operator<<(std::ostream& out, MyClass const& val)
存在。
进一步 MyClass 必须包含一个函数(模板)匹配
template<typename U>
U& print(U& out) const {
out << mBottomLeft << "\t"<< mW << "\t"<< mH;
return out;
}
由于这是由ioprint
.
该函数U& ioprint(U& out)
不是绝对必要的,但如果您没有print
在MyClass
.