运算符重载多个模板

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.

任何帮助将受到高度赞赏.谢谢.

Dav*_*eas 6

实现所需要的常见模式是以相反的方向实际执行它:提供从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+=,通过以值的第一个参数,以一衬垫.如果运营商更复杂,那么这将为两个运营商提供单一实施.