boost — C ++ Adapter — Для методов с тем же именем, но с другим типом возврата

Я пытался найти решение адаптера в 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

0

Решение

Насколько я знаю, невозможно написать функцию, которая имеет тип возвращаемого значения. Поэтому я бы порекомендовал что-то вроде следующего:

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;
}
0

Другие решения

Я хотел бы создать интерфейс адаптера с его собственным возвращаемым значением.

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();
0

По вопросам рекламы [email protected]