2017-08-31 3 views
1

J'ai une classe qui a une méthode surchargée. Une certaine sous-classe hérite de ces deux types. Est-il possible de définir une méthode par défaut appel pour éviter d'avoir à appeler static_cast<class>(obj)Création d'une valeur par défaut pour un appel de fonction surchargé ambigu

struct A {}; 
struct B { 

    void foo(const A) { 
    /*impl*/ 
    } 

    void foo(const B) { 
    /*impl*/ 
    } 
}; 

struct C : A, B { 

}; 

int main() { 
    C c; 
    B b; 
    b.foo(c); //ambiguous 
} 

Est-il possible d'avoir la valeur par défaut du compilateur à un certain appel de méthode?

* Solutions de contournement astucieuses/élégantes acceptées.

+2

Que diriez-vous de déclarer 'void foo (const C)' pour qu'il puisse appeler celui par défaut? – wally

+0

Oh désolé, foo est un appel de méthode d'une superclasse et C est une sous-classe. Je vais éditer ma question pour montrer ceci. –

+0

Essayez peut-être de compiler votre exemple avant de le publier. Il y a beaucoup d'erreurs de syntaxe et la question est maintenant confuse car 'foo' ne peut pas être appelé ainsi si c'est une fonction membre. – wally

Répondre

1

Vous pouvez utiliser un modèle pour faire le static_cast pour vous et appelez ensuite la valeur par défaut:

struct A {}; 
struct B { 

    template<typename T> 
    void foo(T& t) { 
     foo(static_cast<A&>(t)); 
    } 

    void foo(const A) { 
     /*impl*/ 
    } 

    void foo(const B) { 
     /*impl*/ 
    } 
}; 

struct C : A, B { 

}; 

int main() { 
    C c; 
    B b; 
    b.foo(c); //eventually calls foo(A) 
} 

Mais là encore, il pourrait être plus facile de déclarer une fonction membre qui prend C.

+0

A voté pour le meilleur, excellent travail autour. Je n'avais pas réalisé que vous pouviez utiliser des modèles de cette manière sans utiliser les supports en diamant. J'écris une bibliothèque de maths (avec des opérateurs) donc ne pas avoir besoin de static_cast ou <> est fantastique pour la notation propre. Merci –