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

Hel*_*rld 0 c++ data-structures c++11

我有来自第三方库的两个结构,所以我不能改变它们的布局.但是我有两个我自己编写的结构符合它们的签名,所以我可以为它们添加函数(再次,但不是它们的布局,因此也没有虚函数).结构被称为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 */; }
};
Run Code Online (Sandbox Code Playgroud)

我有一个名为的包装类Wrap.我正在寻找一种方法来返回_bfoo类中不使用虚函数的值,因为我不能再改变它们的大小了.

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
Run Code Online (Sandbox Code Playgroud)

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

Ish*_*ael 6

struct Wrap
{
    Wrap(const Foo1& x) : _b(x._b) { }
    Wrap(const Foo2& x) : _b(x._b) { }
    int& _b;
    int GetValue() { return _b; }
};
Run Code Online (Sandbox Code Playgroud)

除非需要类,否则可以使用函数模板来实现相同的效果.

template <typename Foo> int getValue(Foo const& foo)
{
   return foo._b;
}
Run Code Online (Sandbox Code Playgroud)

  • 好像原始片段中GetValue的返回类型已经受到它的影响了? (2认同)
  • @RSahu:很好! (2认同)