2012-01-06 3 views
1

Veuillez considérer cet exemple, comment force-t-on la conversion implicite dans la fonction dont le second paramètre est pointeur vers la fonction membre. Le fait de lancer explicitement dans la liste des arguments de la fonction n'est pas ce que je veux faire maintenant. Au lieu de cela, je voudrais que le compilateur faire en quelque sorte que comme il le fait avec le paramètre FIRST ...Comment forcer la conversion implicite dans le polymorphisme?

struct Base 
{ 
    virtual ~Base() = 0 {} 
}; 

struct Derived : public Base 
{ 
    void f(){} 
}; 

typedef void(Base::*polymorph)(); 

// how do I force IMPLICIT conversion here: EDIT: (polymorph type work only for polymorph pointer type no conversion) 
void func(Base* arg1, polymorph arg2) // void* arg2, (void*) arg2 etc... dosn't work 
{ 
    polymorph temp = reinterpret_cast<polymorph>(arg2); // to achive this 
} 

int main() 
{ 
    Derived* test = new Derived; 
    // first parameter work but another gives an error 
    func(test, &Derived::f); // BY NOT CHANGING THIS! 
    delete test; 
    return 0; 
} 
+1

Je suppose que cela ne peut tout simplement pas être fait. En tout, vous savez (statiquement) que vous avez affaire à un objet Base, et il serait dangereux de prétendre que n'importe quel objet Base possède cette méthode. - Aussi, juste parce qu'il y a un pointeur impliqué, cela ne signifie pas que vous devez utiliser 'new/delete':' Derived test; func (& test, & Derived :: f); ' – visitor

+0

La question n'est pas assez claire. S'il vous plaît expliquer. –

+0

Je veux être en mesure de passer un pointeur sur la méthode membre de ce que jamais de type à l'argument de la fonction qui prend l'argument pointeur-à-membre. dans mon exemple, la fonction devrait prendre le type "polimorph" mais ça ne marchera pas. – codekiddy

Répondre

2

aussi propre qu'il obtient. Code ci-dessous. Mais je n'ai aucune idée de qui est "ce" pointeur sera référencé quand "temp" est réellement appelé.

typedef void(Base::*polymorph)(); 

void func(Base* arg1, polymorph arg2) 
{ 
    polymorph temp = arg2; 
} 


int main() 
{ 
    Derived* test = new Derived; 
    // first parameter work but another gives an error 
    func(test, static_cast<polymorph>(&Derived::f)); 
    delete test; 
    return 0; 
} 
+0

Merci pour l'effort selbie, mais le deuxième paramètre est en cours de conversion explicitely utilisant static_cast mais pas implicitement comme je l'ai prévu. Je voulais faire cela dans la fonction principale sans opérateur de casting. Au lieu de cela, l'opérateur de casting devrait être utilisé ailleurs. mais ce n'est pas possible n'est-ce pas? – codekiddy

+0

@codekiddy - C'est pour les mêmes raisons que vous ne pouvez implicitement transformer un pointeur en une classe de base en pointeur vers une classe dérivée. En plus de cela, comment est-il possible d'invoquer Derived :: f via "temp"? Quel objet va invoquer temp et quel est son type? Si la réponse est "une instance de Base", alors c'est un grand saut pour supposer la sécurité du type. Laissez-moi vous demander: "Qu'est-ce que vous essayez vraiment de toute façon?" Si quelqu'un de mon équipe essayait de faire quelque chose de louche avec un pointeur sur les fonctions des membres, nous pourrions probablement utiliser un meilleur design pour impliquer des interfaces et des méthodes virtuelles. – selbie

+0

ce que j'essayais ne mesure plus car j'ai abandonné. Merci pour votre temps! – codekiddy

Questions connexes