我一直在尝试在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 :(得分: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();