【发布时间】:2014-05-15 11:16:14
【问题描述】:
我正在尝试提出一段逻辑,它需要多个枚举并确定一个结构类型及其相应的大小以传递给第三方组件,我正在考虑使用特征来彻底解决这个问题方式:
蛮力解决方案(使用一个枚举)如下所示:
typedef enum FOO_TYPE
{
FOO_TYPE_0 = 0,
FOO_TYPE_1 = 1,
...
} FOO_TYPE;
switch (m_foo)
{
case (FOO_TYPE_0):
{
FOO_0 Foo = {};
UINT size = sizeof(Foo);
m_thirdParty->CallFunction(&Foo, size);
}
break;
case (FOO_TYPE_1):
...
}
我考虑使用特征通过为每个 FOO_TYPE 定义特化来解决这个问题,但是在编译过程中遇到了这个问题,因为我是在运行时而不是在编译时选择模板的特化。但是,对我来说,如何在不产生上述 switch 语句(当您考虑多种枚举类型时增长非常快)的成本的情况下解决这个问题并不是很明显。如果有人有想法,请告诉我。
template <FOO_TYPE FooType>
struct FooTraits;
template <>
struct FooTraits<FOO_TYPE_0>
{
typedef FOO_0 FooStruct;
};
{
typedef FooTraits<m_foo> FooTraitsType; <== THIS USAGE CAUSES COMPILATION ERRORS
FooTraitsType::FooStruct Foo = {};
UINT size = sizeof(FooTraitsType::FooStruct);
m_thirdParty->CallFunction(&Foo, size);
}
谢谢。
【问题讨论】:
-
不可能?你必须有一个 switch 语句,除非你知道编译时的类型
-
您需要在类型已知的地方使用模板类。当只知道运行时
m_foo整数时,为时已晚。您没有告诉m_foo来自哪里,以及您要解决什么问题。我不知道你需要枚举做什么。如果您只有一个非多态类型的实例,您可以使用sizeof()确定其大小并将其传递给第三方组件。 -
在实践中,有多种枚举类型会影响使用哪个结构,其中一些枚举(即 m_foo)可能来自第三方组件。