2012-03-23 211 views
4

我最近創建了一個工作正常的模板類。模板類C++ - 排除某些類型

現在我想使用「const int」(例如),但動態綁定是禁止的。

是否有可能排除類型const int?

這是我的課;編譯器將會丟棄第二個構造函數的錯誤。我已經看到一個人來了,但我不知道如何以正確的方式修改它 - 和想法?

template <class T> 
class Vector2D 
{ 
public: 
    T X; 
    T Y; 

    Vector2D() 
    { 
     X = 0; 
     Y = 0; 
    }; 

    Vector2D(T x, T y) 
    { 
     X = x; 
     Y = y; 
    }; 
} 
+0

您可以通過重載和/或類型特徵處理像const這樣的限定符。如果你想在調用者在參數中使用'const'限定符時導致編譯器錯誤,那麼在適當的地方使用'static_assert'。 – AJG85 2012-03-23 21:03:01

回答

4

使用成員初始化列表:

template <class T> 
class Vector2D 
{ 
public: 
    T X; 
    T Y; 

    Vector2D(): X(0), Y(0) 
    { 
    }; 

    Vector2D(T x, T y):X(x),Y(y) 
    { 
    }; 
} 

應與const int解決當前的問題。如果您真的有興趣禁止某種類型的遊戲,請看boost::enable_if

3

您可以使用type_traitsstatic_assert,防止您的實例類使用const類型。

#include <type_traits> 

template <class T> 
class Vector2D 
{ 
    static_assert(!std::is_const<T>::value, "T must be non-const"); 
    T X; 
    T Y; 

public: 
    Vector2D() : X(0), Y(0) 
    { 
    } 

    Vector2D(T x, T y) : X(x), Y(y) 
    { 
    } 
}; 


int main() 
{ 
    Vector2D<int> v1(10, 20); 
    Vector2D<const int> v2(10, 20); //static_assert fails 
} 

另外,我已經改變了你的類在構造函數中使用成員初始化列表來初始化成員變量。我製作了xyprivate