2010-01-01 144 views
0

有没有办法提供枚举值作为方法参数在pococapsule而不诉诸工厂方法?使用枚举与Pococapsule(C++ IoC容器)

让说我有采取枚举值在其构造

class A 
{ 
    A(myEnum val); 
} 

使用Pococapsule xml配置类: 我想表达的是这样的:

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

然而,由于pococapsule的基本类型只包括内置类型,如短,字符等,这是不可能的。
我会如何使用pococapsule实例化一个类A?

我可以诉诸使用工厂方法是这样的:

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

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

这是不是很实用。我将不得不为每个使用的枚举的每个可能的值实施新的工厂方法。

有些人会认为枚举:不应该在构造函数或setter方法中传递,因为它是一个类实现的标志。是的我同意。但是,有很多第三方代码和C++框架使用这种风格,所以我需要能够做到这一点。


编辑: 的问题已在Pococapsule的论坛解决。在这个特定情况下的解决方法是让工厂方法执行所需的操作。它不像在xml-config文件中声明enum-use那样灵活,但它将项目向前移动。感谢柯的帮助。

回答

0

(重新发布,作为XML代码在以前的答复滤除)

在C/C++枚举能够以int隐含地通过,因此,可以简单地具有类型= method-arg元素中的“long”。

您也可以使用DSM功能定义您自己的支持您特定枚举的扩展架构(它应该类似于examples/basic-ioc/ext-schema中的用户示例,其中DSM用于类型化地支持用户定义地图类型)。

-ke

0

在C/C++枚举能够为INT隐式传递,因此,你可以简单地做:

您也可以使用DSM的功能定义,支持你的具体你自己的扩展模式枚举(它应该类似于example/basic-ioc/ext-schema中的用户示例,其中DSM用于类型化地支持用户定义的Map类型)。

-ke

+0

谢谢你的回复金柯, 我试图抓住你,但找不到PocoCapsule网站上的电子邮件,也不能在您的博客。 我试图使用它的真实世界的情况是一个框架,它具有与几个不同的枚举重载相同的方法。使用关于使用long的建议不起作用,因为编译器发现错误的重载方法。 如果你有时间,我会很感激,如果你可以通过电子邮件与我联系:z [at] consoft.se。 我觉得这个问题可能太复杂,无法通过此处的讨论来解决(找到正确答案后会发布)。 – Zen 2010-01-09 12:27:21