В прошлом у меня была такая же проблема, и вот как я ее исправил.
Я хотел иметь возможность переключать реализацию библиотеки во время компиляции.
Одна из библиотек использовала такой код:
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 проблемы с фрагментом кода выше. Первая проблема заключается в том, что вы должны скопировать и вставить enum в ваше пространство имен (но с помощью простого регулярного выражения в find & replace, все готово).
Вторая проблема заключается в том, что ваш пользователь должен будет использовать метод «как», что означает, что он не прост, или вы должны обернуть метод / функцию, используя второе решение.
В любом случае, поскольку невозможно внедрить перечисление в пространстве имен, это лучшее решение, которое вы можете сделать. Обратите внимание, что ваш пользователь кода даже не знает, что вы используете библиотеку Lib1 в примере кода.