我正在尝试进行一些重构,我很好奇您将如何解决这个问题。
基本上,我正在尝试为每个类创建一个初始化函数。有一些类是从其他类继承的,如果可能的话,我想使用父初始化函数。您将如何解决?
我想将这些结构与memcpy
一起使用,也许还要将它们与关键字align
和__attribute__((packed))
一起使用;并且它们必须可以与extern "C"
一起使用。然后我将排除构造函数和析构函数。
一个例子来解释:
struct A
{
int a;
};
void initialize(A& a)
{
a = 0;
}
struct B : A
{
int b;
};
void initialize(B& b)
{
initialize(b); // here I want void initialize(A& a), not recursion
b = 0;
};
也许我必须做某种类型的演员?理想情况下,我正在寻找一种不会增加开销的解决方案。
答案 0 :(得分:2)
使用static_cast
。
在您的代码中,initialize(b)
调用将无限递归,因为与{{1}相比,b
与B&
的匹配更好(您要调用的函数的参数) ),因此重载分辨率会选择相同的函数并重复执行。
您指定要初始化A&
对象的A
部分。为什么不告诉编译器呢?告诉它您要像其中的b
一样呼叫initialise
,就像这样:
A
关于您在评论中提到的问题-在此没有副本。但是,如果我使用initialize(static_cast<A&>(b));
,则会创建一个临时对象,但事实并非如此。我没有将static_cast<A>
强制转换为类型b
的对象。我将其强制转换为类型为A
的 reference ,这将导致创建临时引用。由于A
与A&
的匹配要好于A&
,因此将选择第一个函数,从而避免了递归。