2016-02-28 59 views
0

是否可以爲不同的模板參數定義不同的=運算符。讓我們假設我想用不同的方法來轉換不同類型的參數:如何根據類參數定義成員類運算符

template <class T,class U> 
class cTest 
{ 
    private: 
    public: 
    T x; 
    U y; 

    //typical case 
    cTest<T,U>& operator =(const cTest<T,U> &that) 
    { 
    return *this; 
    } 

    //operator = based on the LHS type 1 
    cTest<uint16_t,U>& operator =(const cTest<int,U> &that) 
    { 
    cout<<"cTest<uint16_t,U>& operator =(const cTest<int,U> &that)"<<endl; 
    return cTest<uint16_t,U>(); 
    } 
    //operator = based on the LHS type 2 
    cTest<uint8_t,U>& operator =(const cTest<int,U> &that) 
    { 
     cout<<"cTest<uint8_t,U>& operator =(const cTest<int,U> &that)"<<endl; 
     return cTest<uint16_t,U>(); 
    } 
}; 

回答

2

您試圖返回類型重載運算符/功能。這不是由C++標準允許的:

13.1/2:某些函數聲明不能​​被重載: - 僅在不同的返回類型不能 重載函數聲明。

可能的解決方法:

  • 你可以考慮使用的功能上,而不是運營商,通過引用傳遞變量存儲返回值。在這種情況下,過載是可能的。但它比賦值運算符不太方便,我想這不是你想要的。
  • 更好的方法是在cTest<uint16_t,U>cTest<uint8_t,U>之間添加一個單獨的轉換運算符。
1

我建議你看看Template Metaprogramming

模板元編程是一種通用編程技術,它使用極其早期的綁定。編譯器作爲解釋器或「虛擬計算機」發出構成最終程序的指令。它可以用於靜態配置,自適應程序,優化等等。

你基本上可以讓編譯器決定使用哪個模板定義,具體取決於各自的值。四元數乘法的例子如下所示:

template <typename Quaternion> 
typename std::enable_if_t<sds::is_quaternion<Quaternion>::value, Quaternion> 
operator+(const Quaternion &a, const Quaternion &b) 
{ 
    return Quaternion 
     (
      a.u() + b.u(), 
      a.v() + b.v() 
     ); 
} 
相關問題