有许多结构的构造函数获取它们的大小(通过 sizeof)并执行某些操作。在每个结构中,都必须复制和粘贴代码。这个问题的明显解决方案是创建一个基类,从中继承所有这些结构并将代码移到那里。但是如何在基类的构造函数中获取实际调用其构造函数的类型呢?
struct Base {
public:
Base() {
cout << sizeof( *this ) << endl; // Как тут понять что на самом деле это часть конструктора Foo?
};
uint8_t base_1 = 0;
};
struct Foo : public Base {
uint8_t foo_1 = 0;
};
int main() {
Foo foo; // В консоль будет выведено '1'.
return 0;
}
如何在编译时做同样的事情?
constexpr size_t kFooExpectedSize = 2;
struct Base {
public:
Base() {
static_assert( sizeof( *this ) == kExpectedSize, "Wrong size" ); // Следующий уровень сложности =)
};
uint8_t base_1 = 0;
};
struct Foo : public Base {
uint8_t foo_1 = 0;
};
int main() {
Foo foo;
return 0;
}
选项:
模板方法(本着 CRTP 的精神):
模板构造函数:
带参数的构造函数(如果最终类只需要它的大小):