2012-03-23 96 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