У меня была такая же проблема в прошлом, и вот как я ее исправил. Я хотел иметь возможность переключать реализацию библиотеки во время компиляции. Одна из библиотек использовала такой код:
namespace Lib1
{
enum LibEnum { One, Two, Three };
[...]
void someFunc(LibEnum val);
}
В своем коде я хотел скрыть реализацию библиотеки от взаимодействия с пользователем (поэтому пользователь моего кода никогда не должен видеть, какую библиотеку я использую внутри):
Решение 1:
namespace MyCode
{
// Example to avoid copying a function from Lib1 here
typedef Lib1::someFunc aFunctionImUsing;
// This doesn't work
// typedef LibEnum MyEnum;
// As such code doesn't compile:
// aFunctionImUsing(One); // Error unknown identifier One
// But this did:
struct Type
{
enum MyType { One = Lib1::One, Two = Lib1::Two, Three = Lib1::Three };
}
static inline Lib1::LibEnum as(Type::MyType t) { return (Lib1::LibEnum)t; }
// Now code like this compiles:
aFunctionImUsing(as(Type::One));
// This one doesn't:
// aFunctionImUsing(Type::One); // Can't convert from Type::MyType to Lib1::LibEnum
[...]
}
Решение 2:
namespace MyCode
{
struct Type
{
enum MyType { One = Lib1::One, Two = Lib1::Two, Three = Lib1::Three };
}
// If you don't care about polluting your namespace with numerous wrapper
// you can write this instead of typedef someFunc:
static inline void myFunc(Type::MyType t) { return Lib1::someFunc((Lib1::LibEnum)t); }
// This one does:
myFunc(Type::One);
[...]
}
Это 2 проблемы с фрагментом кода выше. Первая проблема заключается в том, что вы должны скопировать и вставить перечисление внутри вашего пространства имен (но с простым регулярным выражением в поиске и замене все готово). Вторая проблема заключается в том, что вашему пользователю придется использовать метод «как», что означает, что это не так просто, или вам нужно обернуть метод/функцию, используя второе решение.
В любом случае, поскольку внедрить перечисление в пространство имен невозможно, это решение — лучшее, что вы можете сделать. Обратите внимание, что ваш пользователь кода даже не знает, что вы используете библиотеку Lib1 в коде примера.
person
X-Ryl669
schedule
11.10.2009
mySprite
. Это исходит от третьей стороны. См. также как определить перечисление внутри класса и использовать его извне. - person Deanna   schedule 13.07.2015