我正在尝试进行一些重构,我很好奇您将如何解决这个问题。
基本上我试图为每个类创建一个初始化函数。有些类是从其他类继承的,如果可能的话,我想使用父初始化函数。您将如何解决这个问题?
我想将这些结构与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;
};
也许我必须做一些类型转换?理想情况下,我正在寻找一种不会产生开销的解决方案。
最佳答案
使用 static_cast
.
在您的代码中,initialize(b)
调用将无限递归,因为 b
更好地匹配为 B&
比A&
(您要调用的函数的参数),因此重载决议选择相同的函数并重复。
您指定要初始化 A
b
的一部分目的。为什么不告诉编译器呢?告诉它你想打电话 initialise
就好像它是一个 A
,像这样:
initialize(static_cast<A&>(b));
至于您在评论中提到的担忧 - 这里没有复制。如果我使用static_cast<A>
但是,会创建一个临时对象,但事实并非如此。我不类型转换b
类型为 A
的对象。我将其转换为 A
类型的引用 ,这将导致创建临时引用。自 A&
与 A&
匹配比 B&
更好,将选择第一个函数,从而避免递归。
关于c++ - 无递归初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55186370/