2010-03-06 4 views
3

Lors de la préparation à un examen de la POO, j'ai apprécié voir g ++ compiler le code suivant (sans instanciation), même si elle semblait avoir aucun sens:En C++, comment créer une conversion de T à T *?

template<class T> void f() { 
    T t = "a"; 
    t += 5.6; 
    t->b(); 
    T* p = t; 
    p = p*(t/"string"); 
} 

Je me suis alors mis sur un défi de faire ce instancier et compiler.

J'ai créé la classe suivante:

class A { 
    public: 
    A(const char* s) {} 
    void operator+=(double d) {} 
    A operator/(char* str) {return A("");} 
    A* operator->() {return this;} 
    A* operator=(A& a) {return &a;} 
    void b() {} 
}; 
A* operator*(A* a, A b) {return new A("");} 

qui a permis la quasi-totalité du modèle de travailler, à l'exception de la ligne

T* p = t; 

Ma question est, quel opérateur ou constructeur fera ce travail en ligne ? À l'heure actuelle, il me donne « erreur: ne peut pas convertir « A » à « A * » dans l'initialisation »

+0

Une raison particulière pour faire cette chose horrible, ou est-ce juste pour voir si vous le pouvez? –

+0

Ceci est de préparer un examen, et comme un exercice. Je promets de ne jamais écrire de code qui ressemble à ceci dans quelque chose de réel :) – Tzafrir

+0

Ugh. Vous pourriez vouloir passer un examen qui vous demande d'écrire un tel code. – sbi

Répondre

3

Ceci est une ligne complètement vide de sens.

Mais pour le rendre compilable, vous pouvez fournir à l'opérateur de conversion:

operator A*() { return 0; } 

espère que vous comprenez comment est-ce mal.

+0

Fonctionne, et est le plus simple qui fonctionne. Merci! – Tzafrir

0

Mon C/C++ est assez rouillé mais je veux vraiment dire que c'est juste

T* p = &t; 
7

Utilisez le type opérateur de conversion?

class A { 
    //... 
public: 
    template< class T > 
    operator T*() { return this; } 
}; 

Mais clairement, c'est une mauvaise pratique.

+0

... mais c'est vraiment une mauvaise pratique.Vous voulez savoir si vous avez affaire à un objet sur la pile ou avec un pointeur sur un objet. –

+0

Oui, c'est clairement une mauvaise pratique. – Klaim

+0

Correction de l'exemple pour le faire fonctionner avec VS2008, puis ajouté que c'est une mauvaise pratique. – Klaim

1
class A { 
    // ... 
    template <typename T> 
    operator T*() const 
    { 
    // ... 
    } 
    // ... 
}; 
2

Alors que Klaim vous a dit comment, les conversions implicites à des pointeurs de T peuvent conduire à des bugs Subtile - donc s'il vous plaît ne faites pas cela dans le code de production.
Explicitement en prenant l'adresse via l'opérateur &, évitez ces bogues et dites plus clairement quelle était votre intention.

Notez également que votre opérateur d'affectation ressemble, disons inhabituel. Voir le C++ FAQ lite entry pour plus de détails.

+0

Je suis d'accord. C'était comme un exercice de tête-dans-le-mur. – Tzafrir

Questions connexes