C ++ / CLI:枚举的包装方法

时间:2018-09-27 07:46:50

标签: enums c++-cli

我有一个枚举SDKEnum,我需要将其转换为AppEnum。我需要对其进行转换,因为我的项目将是.NET SDK的包装,并且我无法发布该SDK的内部枚举。所以我需要写我的“自己的”。

现在,对于每个枚举,我都需要一种执行以下操作的方法:

AppEnum GetAppEnum (SDKEnum type)
{
  switch (type)
  {
    // Return the correct constant, since AppEnum and SDKEnum have equal constants
  }
}

这样,我将SDK枚举放入该方法中,并获取对应的App枚举。

我不想为我拥有的每个枚举编写该方法。有没有更通用或更完善的方法?

对于C ++ / CLI / C ++,我是C#的新手。

非常感谢!

2 个答案:

答案 0 :(得分:1)

我不知道这些枚举的定义方式,但是很可能它们是(旧的)C风格的enum或(自C ++ 11起)强类型的enum class

下面的代码将被编译,因此static_cast是您的朋友:

namespace
{
    enum OLD_ENUM1 { A=1,B=2};
    enum OLD_ENUM2 { C=1,D=2};
    enum class NEW_ENUM1 { A=1,B=2};
    enum class NEW_ENUM2 { A=1,B=2};
}


int main()
{
    OLD_ENUM1 o1(A);
    OLD_ENUM2 o2(static_cast<OLD_ENUM2>(o1));
    NEW_ENUM1 n1(NEW_ENUM1::A);
    NEW_ENUM2 n2(static_cast<NEW_ENUM2>(n1));

    return EXIT_SUCCESS;
}

请注意,对于OLD_ENUM1和OLD_ENUM2,我无法对枚举值使用相同的名称,因为它们是在没有命名空间的情况下寻址的。对于强类型的枚举,我可以这样做,因为因为它们是类,所以它们具有自己的名称空间。

答案 1 :(得分:0)

好吧,所以诀窍在于定期进行以下强制转换:

enum SDKEnum
{
 One, // (2)
 Two, // (1)
 Three // (0)
}

enum AppEnum
{
 One,
 Two,
 Three
}

AppEnum MethoThatNeededTheConversion(SDKEnum sdkenum)
{
 // DoStuff
 return static_cast<AppEnum>(sdkenum); // Wrong int values returned
}

对我来说重要的是: 除了常数SDKEnum以外,AppEnum还具有其他整数值。因此,我创建了一个测试应用程序,并给出了这些整数值,以便可以同步两个枚举并使用常规强制转换。

感谢@all