C ++适配器 - 对于具有相同名称但不同返回类型的方法

时间:2013-02-18 09:19:38

标签: c++ boost 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解决了这个问题

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

我会创建一个具有自己的返回值的Adapter接口。

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