Sau đây ta nên làm việc với C++ 11.
một chút khéo léo thực sự, nó dựa trên một lời nhận xét của @SamVarshavchik:
#include<cstddef>
#include<functional>
template<std::size_t> struct Int { int i; };
template<std::size_t> struct Char { char c; };
template<std::size_t> struct Bool { bool c; };
template<typename, template<std::size_t> class...>
struct Base;
template<template<std::size_t> class... T, std::size_t... I>
struct Base<std::index_sequence<I...>, T...>: T<I>... {};
template<template<std::size_t> class... T>
struct Check final: Base<std::make_index_sequence<sizeof...(T)>, T...> {};
class A final {
bool _attribute1;
bool _attribute2;
private:
char _attribute3;
// int _attribute4;
};
void serialize(const A &) {
static_assert(sizeof(A) == sizeof(Check<Bool, Bool, Char>), "!");
// do whatever you want here...
}
int main() {
serialize(A{});
}
Ý tưởng cơ bản là để liệt kê tất cả các loại của các thành viên dữ liệu và định nghĩa một kiểu mới từ chúng với một mixin. Sau đó, đặt một số static_assert
vào đúng vị trí.
Lưu ý rằng các thành viên dữ liệu cá nhân cũng được xem xét.
Có một số trường hợp góc có thể phá vỡ nó, nhưng có thể nó có thể hoạt động cho mã thực của bạn.
Là một mặt lưu ý, nó có thể được đơn giản hóa hơn nữa nếu C++ 14 là một lựa chọn:
#include<cstddef>
template<typename... T>
constexpr std::size_t size() {
std::size_t s = 0;
std::size_t _[] = { s += sizeof(T)... };
(void)_;
return s;
}
class A final {
bool _attribute1;
bool _attribute2;
private:
char _attribute3;
// int _attribute4;
};
void serialize(const A &) {
static_assert(sizeof(A) == size<bool, bool, char>(), "!");
// ...
}
int main() {
serialize(A{});
}
Tôi không nghĩ là có thể. –
Điều duy nhất tôi có thể nghĩ đến sẽ là một khẳng định tĩnh ở đâu đó trên sizeof (A). Do đó, nếu một cái gì đó được thêm vào, một cái gì đó sẽ không biên dịch, cho đến khi thành viên lớp mới được tuần tự hóa và khẳng định tĩnh điều chỉnh cho phù hợp. –
Bạn có thể thêm tập lệnh hoặc chương trình tùy chỉnh vào các bước tạo trước hoặc các bước tạo dựng IDE để kiểm tra xem tất cả các thành viên của lớp có được bao gồm trong hàm hay không. – wally