簡體   English   中英

為部分特化類特化成員函數

[英]Specialize member function for partially specialized class

我正在編寫一個包含基本類型並為標量類型調用基本運算符的類。

template<typename _Ty>
class Fundamental {
    using DataType = _Ty;
public:        
    Fundamental(const DataType& value): value(value) {}
    operator DataType() { return value; }
    
    template<typename _Ty2>
    void operator+=(_Ty2 value) { this->value += value; }

    DataType value;
}

我制作了operator+=模板,因此它可以采用任何值而不僅僅是 DataType。 最終允許我添加floatintcharint等等!

指針不是 C++ 中的基本類型,但我也需要實現它。 然而,指針類型只能用整數加減(這就是我需要的)。 所以,要做到這一點,我想到了部分專門化我的指針類並完全專門化operator+=以采用int之類

template<>
template<typename _Ty>
void Fundamental<_Ty*>::operator+=(int value) { this->value += value; }

然而這不起作用並且編譯器抱怨

Fundamental<_Ty*>::operator +=': unable to match function definition to an existing declaration

如何讓操作員只接受整數作為指針?

我嘗試使用聲明

template<typename T>
using Param = typename std::conditional<std::is_pointer<DataType>::value, int, T>::type;

template<typename _Ty>
void operator+=(Param<_Ty> value) { this->value += value; }  

出現錯誤說'...沒有定義此運算符...'。

模板專業化不會刪除默認模板,它只是使一個“特殊”。

現在,您可能可以使用一些 SFINAE 使默認值無效,但正確的方法是簡單地從您的指針特化中省略模板並使用簡單的、僅限 int 的方法。

template<class T>
class Fundamental<T*> {
   //...
   // not a template
   void operator += (int x) { ... }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM