将枚举与Pococapsule(C++IoC容器)一起使用

将枚举与Pococapsule(C++IoC容器)一起使用,c++,ioc-container,poco,C++,Ioc Container,Poco,是否有一种方法可以在pococapsule中提供枚举值作为方法参数,而不必求助于工厂方法 假设我有一个类在其构造函数中接受枚举值 class A { A(myEnum val); } 使用Pococapsule xml配置: 我想这样表达: <bean id="A" class="A"> <method-arg type="MyEnum" value="MyEnum::Value1" /> </bean> MyEnum GetMyEnumV

是否有一种方法可以在pococapsule中提供枚举值作为方法参数,而不必求助于工厂方法

假设我有一个类在其构造函数中接受枚举值

class A
{
    A(myEnum val);
}
使用Pococapsule xml配置: 我想这样表达:

<bean id="A" class="A">
    <method-arg type="MyEnum" value="MyEnum::Value1" />
</bean>
MyEnum GetMyEnumValue1()
{
    return MyEnum::Value1;
}

<bean id="A" class="A">
    <method-arg factory-method="GetMyEnumValue1" />
</bean>
但是,由于pococapsule的基本类型仅包括内置类型,如short、char等,因此这是不可能的。 我将如何使用pococapsule实例化一个类a

我可以使用工厂方法,比如:

<bean id="A" class="A">
    <method-arg type="MyEnum" value="MyEnum::Value1" />
</bean>
MyEnum GetMyEnumValue1()
{
    return MyEnum::Value1;
}

<bean id="A" class="A">
    <method-arg factory-method="GetMyEnumValue1" />
</bean>
这不太实际。我必须为使用的每个枚举的每个可能值实现一个新的工厂方法

有些人可能会争辩说,不应该在构造函数或setter方法中传递enum:s,因为它是一个类做了很多事情的标志。是的,我同意。然而,有很多第三方代码和C++框架,在这里使用这种样式,所以我需要能够做到这一点。 编辑:
该问题在Pococapsule的讨论论坛上得到解决。在这种特定情况下,解决方法是让工厂方法执行所需的操作。它不如在xml配置文件中声明enum use灵活,但它将项目向前推进了。感谢Ke的帮助。

在C/C++中,枚举可以作为int隐式传递,因此,您只需执行以下操作:

您还可以使用DSM功能定义自己的扩展模式,该模式支持您的特定枚举。它应该类似于examples/basic ioc/ext schema中的用户示例,其中DSM用于安全地支持用户定义的映射类型


-Ke

重新发布,因为XML代码在前面的回复中被过滤掉了


在C/C++中,枚举可以作为int隐式传递,因此,只需在方法arg元素中使用type=long即可

您还可以使用DSM功能定义自己的扩展模式,该模式支持您的特定枚举。它应该类似于examples/basic ioc/ext schema中的用户示例,其中DSM用于安全地支持用户定义的映射类型


-Ke

谢谢你的回复Ke Jin,我试图联系你,但在PocoCapsule网站或你的博客上都找不到你的电子邮件。我尝试在一个框架上使用它的实际情况是,使用多个不同的枚举重载相同的方法。使用您关于使用long的建议不起作用,因为编译器发现了错误的重载方法。如果您有时间,我将非常感谢您通过电子邮件与我联系:z[at]consoft.se。我觉得这个问题可能太复杂了,无法通过这里的讨论来解决。找到正确的答案后会贴出来。