2012-03-23 6 views
4

J'ai récemment créé une classe de modèle qui fonctionne bien.Modèle Classe C++ - exclure certains types

Maintenant, je voulais utiliser « const int » (par exemple), mais est interdite de liaison dynamique.

est-il possible d'exclure le type const int?

c'est ma classe; le compilateur abandonnera une erreur pour le 2ème constructeur. J'ai vu celui-là venir, mais je ne sais pas comment le modifier de la bonne façon - et des idées?

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

Vous pouvez gérer des qualificatifs comme 'const' via des surcharges et/ou des caractères de type. Si vous voulez provoquer une erreur de compilation lorsque les appelants utilisent le qualificateur 'const' dans l'argument, utilisez' static_assert' à l'endroit approprié. – AJG85

Répondre

4

Utilisez les listes d'initialisation de membre:

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

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

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

Cela devrait résoudre votre problème actuel avec const int. Si vous êtes vraiment intéressé à interdire un certain type en général, jetez un oeil à boost::enable_if.

3

Vous pouvez utiliser type_traits et static_assert pour empêcher votre instanciation classe en utilisant un type 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 
} 

Aussi, j'ai changé votre classe d'utiliser des listes d'initialisation membres dans le constructeur pour initialiser les variables membres. Et j'ai fait x et yprivate.

Questions connexes