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成员方法解决了我的问题。谢谢!