2017-06-07 1 views
-1

Si je comprends bien, il existe des fonctions spéciales qui se propagent à tous les membres du champ par défaut. : -
affectation de copie, constructeur de copie, affectation de mouvement, déplacer constructeur, destructor, etc.émule une fonction qui se propage dans tous les champs comme opérateur = et destructeur

class B{}; 
class C{B b;};  
C c1; C c2; 
c1=c2; //<-- automatic invoke B::operator=() 

Est-il possible de déployer une astuce C++ pour créer/émuler une fonction personnalisée qui a une telle fonctionnalité cool?

Si non, c'est une réponse complète.
Si oui, veuillez montrer la démo; Je crois que ce devrait être une fonction gratuite, par ex. : -

class A{}; 
class B{}; 
void f(A a){} 
class C{public: A a;B b;};  
//no need to code "void f(C c){f(c.a);}" 
C c1; 
f(c1); //<-- automatic invoke f(c1.a), but not invoke f(c1.b) 

fonction modèle et SFINAE pourrait être utile, mais je ne sais pas comment appliquer dans ce cas. Je pense que cela peut être utile pour un peu plus d'avance RAII.

Répondre

2

Ecrire as_tie:

struct C{ 
    A a; 
    B b; 
    friend auto as_tie(C& c){ 
    return std::tie(c.a, c.b); 
    } 
}; 

vous devez écrire pour chaque type que vous voulez interagir avec cette façon; il n'y a aucun moyen d'éviter cela jusqu'à ce que la réflexion à la compilation arrive en C++. Cependant, as_tie rend des choses comme ==, swap, et similaires, faciles à mettre en œuvre, de sorte que vous obtenez des gains de bonus. Après cela, un mélange de l'élément tuple-foreach, des objets set override, des y-combinators et invoke-if-possible vous permet de dire "appliquer récursivement f à chacun de ses membres".

Si vous n'avez pas à faire cela des dizaines de fois dans une variété de contextes, cela ne vaudra pas la peine.

En bref, non, pas vraiment. Mais peut-être sorta avec beaucoup de travail.