met*_*cpp 4 c++ templates operator-overloading
template <class T>
class A
{
private:
T m_var;
public:
operator T () const { return m_var; }
........
}
template<class T, class U, class V>
const A<T> operator+ (const U& r_var1, const V& r_var2)
{ return A<T> ( (T)r_var1 + (T)r_var2 ); }
Run Code Online (Sandbox Code Playgroud)
这个想法是为情况重载+运算符一次(而不是三次):数字+ A,A +数字,A + A(其中数字类型为T,与m_var相同).一个有趣的例子是m_var是例如int并且r_var是long.
任何帮助将受到高度赞赏.谢谢.
实现所需要的常见模式是以相反的方向实际执行它:提供从T模板的隐式转换,并仅定义模板的运算符.
template <typename T>
struct test {
T m_var;
test( T const & t ) : m_var(t) {} // implicit conversion
test& operator+=( T const & rhs ) {
m_var += rhs.m_var;
}
friend test operator+( test lhs, test const & rhs ) { // *
return lhs += rhs;
}
};
// * friend only to allow us to define it inside the class declaration
Run Code Online (Sandbox Code Playgroud)
关于成语的几个细节:operator+被声明为朋友只允许我们在类花括号内定义一个自由函数.在查找编译器时,这有一些优点,因为如果其中一个参数已经是a,它将只考虑该运算符test.
由于构造函数是隐式的,因此如果切换到,则调用test<int> a(0); test<int> b = a + 5;将转换为等效的.test<int> b( a + test<int>(5) );5 + a
的operator+是在以下方面实现的operator+=,通过以值的第一个参数,以一衬垫.如果运营商更复杂,那么这将为两个运营商提供单一实施.
| 归档时间: |
|
| 查看次数: |
981 次 |
| 最近记录: |