C++ 根据基础对象类型获取成员的值

C++ 根据基础对象类型获取成员的值,c++,c++11,data-structures,C++,C++11,Data Structures,我有两个来自第三方库的结构,所以我不能更改它们的布局。但我有两个自己编写的结构,它们与它们的签名相匹配,因此我可以向它们添加函数(同样,但不是它们的布局,因此也没有虚拟函数)。结构称为Foo1和Foo2。两者都具有名为\u b的相同成员,但偏移量不同 struct FooBase { }; struct Foo1 : FooBase { int _a = 2; int _b = 1; }; struct Foo2 : FooBase { int _b = 2; };

我有两个来自第三方库的结构,所以我不能更改它们的布局。但我有两个自己编写的结构,它们与它们的签名相匹配,因此我可以向它们添加函数(同样,但不是它们的布局,因此也没有虚拟函数)。结构称为
Foo1
Foo2
。两者都具有名为
\u 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
的包装类。我正在寻找一种方法来返回
\u 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
有什么想法吗?我在评论中发布了一种方法,但很想找到更好的解决方案。

struct Wrap
{
包裹(const Foo1&x):_b(x._b){
包裹(const Foo2&x):_b(x._b){}
int&U b;
int GetValue(){return_b;}
};
除非需要类,否则可以使用函数模板达到相同的效果

template <typename Foo> int getValue(Foo const& foo)
{
   return foo._b;
}
模板int-getValue(Foo-const&Foo)
{
返回foo.\u b;
}
struct Wrap
{
包裹(const Foo1&x):_b(x._b){
包裹(const Foo2&x):_b(x._b){}
int&U b;
int GetValue(){return_b;}
};
除非需要类,否则可以使用函数模板达到相同的效果

template <typename Foo> int getValue(Foo const& foo)
{
   return foo._b;
}
模板int-getValue(Foo-const&Foo)
{
返回foo.\u b;
}


Foo1::_b
Foo2::_b
是完全不相关的。似乎应该有一种静态的方法,因为它们有相同的名称,但这不是它的工作方式。如果所有
Foo
都有一个
int\u b
数据成员,那么它应该是
FooBase
的成员。我可以在
Wrap
中添加一个
std::function
,它将包含
Foo1
Foo2
的函数,返回该成员。我觉得这不是最好的解决办法,小心!您的
\ux
需要是一个引用,而不是一个值。
FooBase
实例既没有
\u A
也没有
\u b
@HelloWorld,只要假装它们有不同的名称即可。当你构造一个
Wrap
实例时,你是否有一个具体的类型给构造函数,或者仅仅是一个
FooBase&
Foo1::\b
Foo2::\b
是完全不相关的。似乎应该有一种静态的方法,因为它们有相同的名称,但这不是它的工作方式。如果所有
Foo
都有一个
int\u b
数据成员,那么它应该是
FooBase
的成员。我可以在
Wrap
中添加一个
std::function
,它将包含
Foo1
Foo2
的函数,返回该成员。我觉得这不是最好的解决办法,小心!您的
\ux
需要是一个引用,而不是一个值。
FooBase
实例既没有
\u A
也没有
\u b
@HelloWorld,只要假装它们有不同的名称即可。当你构造一个
Wrap
实例时,你是否有一个具体的类型给构造函数,或者仅仅是一个
FooBase&
?这假设用户知道
x
的真实类型。似乎原始代码段中GetValue的返回类型已经受到它的影响了?在所有情况下
GetValue
的返回类型显然都是
int
。@RSahu:不错!我现在觉得很傻。我把Foo放在Wrap类中,而不是把实际的成员作为引用,这让我太专注了。我接受这个答案。int-ref成员方法解决了我的问题。谢谢!这假设用户知道
x
的实际类型。似乎原始代码段中GetValue的返回类型已经受到它的影响了?在所有情况下,
GetValue
的返回类型显然都是
int
。@RSahu:不错!我现在觉得很傻。我把Foo放在Wrap类中,而不是把实际的成员作为引用,这让我太专注了。我接受这个答案。int-ref成员方法解决了我的问题。谢谢!