0

我一直在尝试在 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 解决了这个问题

4

2 回答 2

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;
}
于 2013-02-18T09:49:51.383 回答
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();
于 2013-02-18T10:38:07.273 回答