我有来自第三方库的两个结构,所以我无法更改其布局。但是我有两个我自己编写的结构符合它们的签名,所以我可以为它们添加函数(再次,但不是它们的布局,因此也没有虚函数)。结构称为Foo1
和Foo2
。两者都有相同的成员_b
,但不同的偏移。
struct FooBase { };
struct Foo1 : FooBase
{
int _a = 2;
int _b = 1;
};
struct Foo2 : FooBase
{
int _b = 2;
};
struct Wrap
{
Wrap(const FooBase& x) : _x(x) { }
FooBase& _x;
int GetValue() { return /* MISSING */; }
};
我有一个名为Wrap
的包装类。我正在寻找一种方法来返回_b
的值,而不使用foo类中的虚函数,因为我不能再改变它们的大小了。
Foo1 f1 = Foo1();
Wrap x = f1;
int a = x.GetValue(); // should return 1
Foo2 f2 = Foo2();
Wrap y = f2;
int b = y.GetValue(); // should return 2
有什么想法吗?我在评论中发布了一种方法,但对更好的解决方案感到好奇。
答案 0 :(得分:6)
struct Wrap
{
Wrap(const Foo1& x) : _b(x._b) { }
Wrap(const Foo2& x) : _b(x._b) { }
int& _b;
int GetValue() { return _b; }
};
除非需要类,否则您可以使用功能模板达到相同的效果。
template <typename Foo> int getValue(Foo const& foo)
{
return foo._b;
}