2010-11-29 5 views
0

http://codepad.org/etWqYnn3Reflexion Perfect Forwarding et le motif des visiteurs

Je travaille sur une certaine forme d'un système de réflexion pour C++, malgré les nombreux qui ont mis en garde contre. Ce que je cherche à avoir est un ensemble d'interfaces IScope, IType, IMember, IMonikerClient et une classe wrapper qui contient le CReflexion ci-dessus. Ignorant tout sauf le membre qui est la partie importante ici est ce que je voudrais faire:

1) Instance l'emballage

2) Déterminer quel type doit être utilisé

3) type d'instance

4) Surcharger le() et [] pour accéder au contenu de membre externe (l'emballage) dans le code aussi facilement qu'il se fait lors de l'utilisation d'un std :: vecteur

Je trouve que l'utilisation 0x je peux transmettre un appel de méthode avec n'importe quel type pour un paramètre. Je ne peux que la fonte ne cependant dynamiquement jetai prend pas une variable (à moins qu'il existe des moyens que je ne connais!)

I lié l'idée approximative ci-dessus. J'utilise actuellement une instruction switch pour gérer les différentes interfaces. Je voudrais, et pour des raisons évidentes, aimer l'effondrer. Les erreurs de correspondance de type dans les cas de commutation sont la cause de l'appel aux méthodes de compilation dans chaque cas où un seul des trois travaux pour une condition et des erreurs de compilateur sont lancés.

Quelqu'un pourrait-il suggérer quoi que ce soit pour moi ici? C'est en dehors de coller à VARIANT:/

Merci!

+0

1. C'est "réflexion" pas "réflexion". 2. Vous auriez besoin d'annoter chaque méthode/portée/classe etc manuellement pour obtenir quelque chose comme la réflexion. Vous rencontrez des problèmes simplement parce que C++ n'expose pas le type d'information que vous recherchez. 3.Vous ne pouvez pas imaginer un meilleur nom pour vos structures que "A" "B" ou "C"? –

Répondre

1

C++, même dans « la terre 0x », ne pas exposer simplement le genre d'information que vous devez créer quelque chose comme réflexion.

Je trouve qu'en utilisant 0x je peux transférer un appel de méthode avec n'importe quel type pour un paramètre.

Vous ne pouvez pas transférer un type en tant que paramètre. Vous pouvez transférer les qualificatifs const-volatile sur un membre, mais tout cela est fait dans les templates, au moment de la compilation. Aucune vérification de durée d'exécution n'est jamais effectuée lorsque vous utilisez des choses comme l'avant.

Votre modèle là pour l'opérateur() ne va compiler à moins T est à int* convertable, string* et A** à la fois. Considérez les modèles comme un simple algorithme de recherche et de remplacement qui génère plusieurs fonctions pour vous: la valeur de T est remplacée par le nom de type lorsque le modèle est instancié et la fonction est compilée normalement.

Enfin, vous ne pouvez utiliser que dyanmic_cast pour faire tomber la hiérarchie des classes - la conversion entre les types complètement indépendants A B et C ne fonctionnera pas correctement.

Vous êtes mieux prendre le temps de repenser votre conception de telle sorte qu'il ne se sert pas du tout la réflexion. Ce sera probablement un meilleur design de toute façon, en considérant même dans un langage avec réflexion, la réflexion est le plus souvent utilisée pour masquer des conceptions médiocres.