根据底层对象类型获取成员的值

时间:2018-02-27 19:12:07

标签: c++ c++11 data-structures

我有来自第三方库的两个结构,所以我无法更改其布局。但是我有两个我自己编写的结构符合它们的签名,所以我可以为它们添加函数(再次,但不是它们的布局,因此也没有虚函数)。结构称为Foo1Foo2。两者都有相同的成员_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

有什么想法吗?我在评论中发布了一种方法,但对更好的解决方案感到好奇。

1 个答案:

答案 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;
}