Tôi đã sử dụng lập trình meta khá nhiều, nhưng đôi khi sự kết hợp của các macro và mẫu c chỉ là không đủ.Có bất kỳ lựa chọn thay thế lập trình meta C++ nào ngoài mẫu không?
Tôi cho rằng nhược điểm có khả năng sẽ thiếu khả năng tương thích đa nền tảng nếu nền tảng lập trình meta chỉ dành cho, nói, Linux, vv
Vì vậy, yeah, có điều như vậy có sẵn ngay bây giờ, bên cạnh mẫu? Google tìm kiếm siêu lập trình bị chi phối bởi lập trình meta mẫu, vì vậy thật khó để tìm thấy ngay bây giờ ..
chỉnh sửa: đây là một ví dụ về điều tôi đang làm việc.
Giả sử tôi có một lớp chung để lưu/tải tệp vào và từ bộ đệm. Hãy gọi nó là FilePack.
Tôi có một định nghĩa vĩ mô, trông giống như
defineFilePack(BaseClass, "code-a")
Về cơ bản nó tạo ra một lớp được gọi là "BaseClassPack", được định nghĩa là một lớp con. Dưới đây là điều đó.
class FilePack{
public:
char * thebuffer;
int bufsize;
string packcode;
// and constructors etc
FilePack(const string& thecode, int bufsize);
void operator=(FilePack& rhs);
void saveToFile(const string& filename);
void loadFromFile(const string& filename);
// .. and all the function you'd expect to see in a class like this
};
// the person details
class PersonDetails{
public:
solidstring<64> name;
int age;
DateTime birthday;
// .. yada yada yada
};
defineFilePack(PersonDetails, "psd")
// the above creates the following class
class PersonDetailsPack : public FilePack{
public:
PersonDetailsPack():
FilePack("psd", sizeof(PersonDetails)){ // etc
}
PersonDetails& get(){
return *(PersonDetails*)getBuffer();
}
// and a lot more convenience function
};
Bây giờ, thực sự có một kiểm tra được xây dựng bởi nhà xây dựng của FilePack rằng mã được khai báo khớp với kích thước, sử dụng bản đồ toàn cầu.
Ngay bây giờ, tôi đã nói về cách làm điều đó bằng cách sử dụng lập trình meta mẫu, điều này thực sự phù hợp với nó vì tất cả các mã filepack này được khai báo bên trong tệp nguồn. Chắc chắn, một ai đó có thể có thể tạo FilePack của riêng họ trong thời gian chạy, nhưng đó là ngoài điểm.
Một điều khác mà lập trình meta có thể trợ giúp ở đây là hỗ trợ tải các phiên bản FilePack khác nhau. Giả sử tôi phải cập nhật lớp PersonDetails .. Tôi chỉ cần tạo một lớp mới, sử dụng một số loại siêu lập trình để khai báo thừa kế, và kỳ diệu làm cho FilePack biết để khi nó tải phiên bản cũ của PersonDetails, nó có thể gọi hàm chuyển đổi, hoặc bất cứ điều gì.
Ngoài ra, bạn có thể nhận xét về kiến trúc đó và tôi muốn nghe bất kỳ nhận xét nào về kiến trúc đó, nhưng nó có thể hơi thiếu chủ đề?
Bạn có thể cung cấp ví dụ về điều gì đó mà các mẫu + macro không đủ? Đây sẽ là một điểm khởi đầu tốt cho cuộc thảo luận. –
@David Rodriguez: Ví dụ: tạo mã nối tiếp các lớp qua kết nối mạng hoặc nói chung làm điều gì đó cho mọi thành viên. – 6502
"nhưng đôi khi sự kết hợp của macro và mẫu c chỉ là không đủ" - cái gì bị thiếu/không đủ? – Naveen