Я пытался найти решение адаптера в C ++ для двух внешних интерфейсов, которые настолько похожи, но отличаются в типах возвращаемых значений в перечислениях.
enum
{
SAME_VALUE1,
SAME_VALUE2
} EnumTypeA
enum
{
SAME_VALUE1,
SAME_VALUE2,
DIFFERENT_VALUE3
} EnumTypeB
class A // not inherited
{
EnumTypeA Method();
}
class B // not inherited
{
EnumTypeB Method();
}
Есть ли у вас какие-либо идеи о решении, чтобы я мог использовать оболочку для вызова интерфейса A или B?
ReturnType? MyAdapter::Method()
{
// Call Method from A or B but how
}
С Уважением,
Бурак
Добавлено примечание: я решил проблему с помощью Boost.Variant
Насколько я знаю, невозможно написать функцию, которая имеет тип возвращаемого значения. Поэтому я бы порекомендовал что-то вроде следующего:
enum ReturnTypeEnum
{
ReturnTypeA,
ReturnTypeB
};
struct ReturnType
{
ReturnTypeEnum actualType;
union
{
EnumTypeA a;
EnumTypeB b;
}actualValue;
}
ReturnType MyAdapter::Method()
{
ReturnType retval;
//Call method from A or B, whichever necessary
//and construct retval accordingly.
return retval;
}
Я хотел бы создать интерфейс адаптера с его собственным возвращаемым значением.
struct Adapter
{
virtual ~Adapter() {}
enum Enum {
VALUE1,
VALUE2,
VALUE3,
};
virtual Enum Method( ) = 0;
};
затем создайте адаптер для A и B.
struct AdapterA : public Adapter {
Enum Method( ) override { return Enum( a.Method() ); };
A a;
};
struct AdapterB : public Adapter {
Enum Method( ) override { return Enum( b.Method() ); };
B b;
};
Скорее всего, они должны быть в отдельных файлах реализации, поэтому SAME_VALUE1
не конфликтуйте с компиляцией. Тогда вы можете сделать следующее:
std::unique_ptr<Adapter> drv;
drv.reset( new AdapterA() );
drv->Method();
drv.reset( new AdapterB() );
drv->Method();