2010-01-01 6 views
0

Existe-t-il un moyen de fournir des valeurs enum comme méthode-args dans pococapsule sans avoir recours à des méthodes d'usine?Utilisation d'enums avec Pococapsule (conteneur C++ IoC)

Disons que j'ai une classe qui prend une valeur ENUM dans son constructeur

class A 
{ 
    A(myEnum val); 
} 

Utilisation de la configuration Pococapsule xml: Je voudrais exprimer quelque chose comme ceci:

<bean id="A" class="A"> 
    <method-arg type="MyEnum" value="MyEnum::Value1" /> 
</bean> 

Cependant, depuis Les types de base de pococapsule incluent uniquement les types intégrés tels que short, char, etc. ce n'est pas possible.
Comment est-ce que j'irais instancier une classe A en utilisant pococapsule?

je pouvais recourir à l'utilisation de méthodes d'usine quelque chose comme ceci:

MyEnum GetMyEnumValue1() 
{ 
    return MyEnum::Value1; 
} 

<bean id="A" class="A"> 
    <method-arg factory-method="GetMyEnumValue1" /> 
</bean> 

Ce qui est pas très pratique. Je devrais implémenter une nouvelle méthode d'usine pour chaque valeur possible de chaque énumération utilisée.

Certains avancent que enum: s ne devrait pas être passé dans les constructeurs ou les méthodes setter car c'est le signe d'une classe qui en fait beaucoup. Oui je suis d'accord. Cependant, il y a beaucoup de code tiers et de frameworks C++ qui utilisent ce style, donc je dois être capable de le faire.


Edit: Le problème a été résolu sur le forum de discussion de Pococapsule. Dans ce cas précis, la solution était de faire en sorte que les méthodes d'usine effectuent l'action souhaitée. Il n'est pas aussi flexible que la déclaration d'enum-use dans le fichier xml-config, mais il a fait avancer le projet. Merci Ke pour votre aide.

Répondre

0

(rediffuser, comme le code XML a été filtré en réponse précédente)

en C/C++ énumérations peuvent être transmis comme int implicitement, par conséquent, vous pouvez simplement avoir le type = "long" dans l'élément method-arg.

Vous pouvez également utiliser la fonction DSM pour définir votre propre schéma d'extension qui prend en charge votre énumération spécifique (similaire à l'exemple utilisateur dans examples/basic-ioc/ext-schema où DSM est utilisé Type de carte).

0

en C/C++ énumérations peuvent être transmis comme int implicitement, par conséquent, vous pouvez simplement faire:

Vous pouvez également utiliser la fonction DSM pour définir votre propre schéma s'étendre qui prend en charge votre spécifique enum (il devrait ressembler à l'exemple de l'utilisateur dans examples/basic-ioc/ext-schema où DSM est utilisé pour supporter de manière spécifique le type Map défini par l'utilisateur).

Ke

+0

Ke Merci pour la réponse Ke Jin, J'ai essayé de mettre la main sur vous, mais ne pouvait pas trouver votre email sur le site PocoCapsule, ni sur votre blog. Le cas réel que j'essaie de l'utiliser est un cadre qui a la même méthode surchargée avec plusieurs enums différents. L'utilisation de votre suggestion sur l'utilisation de long ne fonctionne pas car le compilateur trouve la mauvaise méthode surchargée. Si vous aviez le temps j'apprécierais si vous pouviez me contacter par email: z [at] consoft.se. Je pense que le problème pourrait être trop complexe à résoudre par la discussion ici (la bonne réponse sera affichée quand elle sera trouvée). – Zen