2010-09-29 23 views
0

Si j'ai ces 2 constructeurs pour MyClass:cast Implicite par constructeur avec plusieurs arguments

MyClass(int n1); 
MyClass(int n1, int n2); 

et une surcharge (non membres) operator+:

MyClass operator+(MyClass m1, const MyClass& m2); 

Cela me permet d'écrire du code comme ce:

MyClass m; 
5 + m: 

qui je suppose utilise un casting implicite à travers le constructeur défini, correct?

Est-il possible de faire ce cast implicite avec le constructeur prenant 2 arguments? Avec le code ressemblant à quelque chose comme ceci:

MyClass m; 
{15, 8} + m: 

?

Ou peut-être simplement faire un cast explicite de {9, 4} à un objet MyClass?

+3

Est-ce que ceux qui devront maintenir ce code plus tard (ce qui pourrait vous inclure, BTW) une faveur et rendre ce constructeur «explicite». IME à long terme conversions implicites créent plus de problèmes que ce qu'ils valent. – sbi

+0

Et mettre MyClass (5) + m sera toujours plus clair quand quelqu'un lira ceci au lieu de devoir retourner à la classe pour se demander à quel type il est converti, le cas échéant, ou si vous ajoutez juste un int à celui-ci. – David

+0

sbi: cela semble raisonnable. Comment rendre le constructeur explicite? Juste ajouter le mot-clé explicite devant la déclaration? – Moberg

Répondre

5

En un mot, non. L'option la plus succincte est MyClass(15,8) + m;.

1

Non, mais vous pouvez construire en place:

MyClass m; 
m + MyClass(15,8); 
0

Je ne crois pas, mais pourquoi avez-vous besoin d'être plus implicite qu'explicite? Si vous allez devoir utiliser la notation de support de toute façon, ce n'est pas quelque chose qui pourrait être généré à partir d'une seule variable, donc je ne crois pas qu'il y ait aucun inconvénient à dire simplement:

myclass(15, 8) + m;

Cette volonté le générer sur la pile et produire le même résultat qu'une distribution implicite.