2009-11-09 6 views
1

J'ai la classe CppProperty de classe suivante qui détient la valeur:Comment faire pour convertir C++ classe/struct à un primitif/différent type/classe/struct?

template<typename TT> 
class CppProperty 
{ 
    TT val; 
public: 
    CppProperty(void) 
    { 
    } 

    CppProperty(TT aval) : val(aval) 
    { 
    } 

    CppProperty(const CppProperty & rhs) 
    { 
     this->val = rhs.val; 
    } 

    virtual ~CppProperty(void) 
    { 
    } 

    TT operator=(TT aval) 
    { 
     this->val = aval; 
     return this->val; 
    } 

    friend TT operator++(CppProperty & rhs); 
    friend TT operator--(CppProperty & rhs); 
    friend TT operator++(CppProperty & rhs, int); 
    friend TT operator--(CppProperty & rhs, int); 

    //template<typename RR> 
    //friend RR operator=(RR & lhs, const CppProperty & rhs); 
    //friend int & operator=(int & lhs, const CppProperty & rhs); 
    //int reinterpret_cast<int>(const CppProperty & rhs); 
}; 

Je veux faire la cession comme ceci:

CppProperty<char> myproperty(10); 
myproperty++; 
int count = myproperty; 

Comment cela peut être fait? Je ne peux pas remplacer l'opérateur =. Toute aide est grandement appréciée! Je vous remercie!

Répondre

5

Vous auriez besoin d'un opérateur de conversion:

operator const TT&(void) const 
{ 
    return val; 
} 


operator TT&(void) 
{ 
    return val; 
} 

Il y a un bref tutoriel sur les opérateurs de conversion here. En résumé, lorsque le compilateur essaie de convertir un type, il regarde d'abord le côté droit pour un opérateur qui le convertira en le type désiré. Ce que nous faisons est de dire "Quoi que soit TT, cette classe peut être convertie".

Si aucun opérateur n'est trouvé, il cherche à voir si le côté gauche peut être construit du côté droit, et ainsi de suite. (Jusqu'à ce que, si elle ne peut pas trouver une conversion, il émet une erreur.)


Vous pouvez supprimer votre constructeur par défaut explicitement défini si vous déclarez votre autre constructeur comme ceci:

// If not specified, construct with default-constructed type. 
CppProperty(TT aval = TT()) : val(aval) 
{ 
} 
+0

Merci GMan! Ça a l'air cool! Laissez-moi essayer et revenir vers vous dans un court moment;) – Viet

+0

Cela fonctionne comme le charme! Merci encore! – Viet

+0

Pas de problème, assurez-vous que vos 'const' sont dans l'emplacement correct, je les ai eu en arrière dans le premier message. – GManNickG

1

Vous devez indiquer operator int() à votre classe pour autoriser la conversion implicite en int.

+0

Hi Naveen! Merci pour la réponse rapide. Alors comment convertir en différentes classes/types de données en utilisant des opérateurs? – Viet

Questions connexes