C ++ / CLI: метод упаковки для перечислений - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть перечисление 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 голосов
/ 27 сентября 2018

Ладно, что за хитрость заключалась в следующем обычном приведении:

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

0 голосов
/ 27 сентября 2018

Я не знаю, как определяются эти перечисления, но, скорее всего, они либо (старые) в стиле C enum s, либо (начиная с C ++ 11) строго типизированы enum class es.

Следующий код компилируется, поэтому 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 я не могу использовать одинаковые имена для значений перечисления, поскольку они адресованы без пространства имен.Для строго типизированных перечислений я могу сделать это, потому что, поскольку они являются классами, у них есть свои собственные пространства имен.

...