Comment passer un pointeur de fonction qui pointe du constructeur?
Je suis en train de travailler sur la mise en œuvre d'un mécanisme de réflexion en C++.
Tous les objets à l'intérieur de mon code sont une sous-classe de l'Objet(de mon propre type générique) qui contiennent un membre statique de référence de type de Classe.
class Class{
public:
Class(const std::string &n, Object *(*c)());
protected:
std::string name; //Name for subclass
Object *(*create)(); //Pointer to creation function for subclass
};
Pour toute sous-classe de l'Objet avec un membre de Classe statique donnée, je veux être capable d'initialiser 'créer' avec un pointeur vers le constructeur de cette sous-classe.
- Bien que cela soit 6 ans après les faits, vous devriez donner beaucoup de pensée de savoir si vous voulez vraiment mettre en place votre propre réflexion mechanisn. D'abord songer à régler pour le moment de la compilation de "réflexion" à l'aide de modèles, type_traits et la SFINAE principe; ensuite, essayez l'une de l'existant en C++ réflexion bibliothèques; et c'est alors seulement que je considère avoir un aller à moi-même.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas prendre l'adresse d'un constructeur de C++98 Standard 12.1/12 Constructeurs - "12.1-12 Constructeurs - "L'adresse d'un constructeur ne doit pas être pris.")
Votre meilleur pari est d'avoir une usine de fonction/méthode qui crée le
Object
et passer l'adresse de l'usine:J'ai rencontré ce même problème. Ma solution a été d'un modèle de fonction qui appelle le constructeur.
Pour l'utiliser comme un pointeur de fonction est simple:
Et pour obtenir une instance de Maclasse:
Hmm, bizarre.
create
est une variable de membre c'est à dire uniquement disponible dans les instances de classe, mais l'intention de ce qui semble être la création d'une instance en premier lieu.Vous ne pouvez pas prendre l'adresse d'un constructeur, mais vous pouvez créer statique méthodes de fabrique de votre propre et de prendre l'adresse de celui-ci.
Lambda style:
Vous ne pouvez pas utiliser les pointeurs de fonction sur les méthodes, vous devez utiliser la méthode des pointeurs, qui ont bizarre syntaxe:
Cela vous donne une méthode pointeur MyClass de la méthode - MyMethod. Cependant, ce n'est pas un vrai pointeur en ce qu'il n'est pas un absolu adresse de mémoire, il s'agit essentiellement d'un décalage (plus compliqué que cela, en raison de l'héritage virtuel, mais ce genre de choses est la mise en œuvre spécifique) dans une classe. Donc pour utiliser la méthode de pointeur, vous devez fournir une classe, comme ceci:
ou
Bien sûr, il devrait être évident que vous ne pouvez pas utiliser une méthode pointeur sur un objet le constructeur. Afin d'utiliser une méthode de pointeur, vous devez avoir une instance de la classe du constructeur a déjà été appelé! Si dans votre cas, Michael Objet d'Usine suggestion est probablement la meilleure façon de le faire.
À l'aide de Qt, vous pouvez appeler un constructeur avec Qt réflexion mécanismes (QMetaObject) si vous déclarez le constructeur comme Q_INVOKABLE (rien de plus à faire que cela).
Je ne suis pas sûr que vous souhaitez intégrer Qt juste pour cette fonction 😉 mais peut-être que vous aimeriez avoir un regard sur la façon dont il le fait.
http://doc.qt.io/qt-5/metaobjects.html#meta-object-system