Có thể sử dụng mẫu meta-programming để chuyển đổi bất kỳ cấu trúc hoặc lớp nào thành một bộ dữ liệu không?TMP: làm thế nào để viết mã mẫu mà chuyển đổi bất kỳ cấu trúc thành một bộ dữ liệu?
Ví dụ:
struct Foo
{
char c;
int i;
std::string s;
};
typedef std::tuple< char, int, std::string > Foo_Tuple;
Nó sẽ được tốt đẹp để có một số mẫu mã mà sẽ tạo ra Foo_Tuple automagically cho tôi.
ĐÁP
Đây là quá mức cần thiết cho một trường hợp đơn giản như vậy, nhưng đối với những trường hợp phức tạp hơn (ví dụ như ORM hoặc bất cứ lúc nào bạn cần phải viết rất nhiều mã nồi hơi-tấm, và chỉ một mẫu hoặc vĩ mô là không đủ cho công việc), Boost Mirror có vẻ như nó có thể cực kỳ hữu ích. Tôi đã đào sâu vào Boost Mirror nhiều hơn một chút: chức năng phản chiếu cơ bản (trong Mirror và Puddle) không khó hiểu, khá dễ cài đặt và có vẻ khá rộng rãi (có thể xử lý nhiều cấu trúc, bao gồm C++ 11 các lớp enum, v.v.). Tôi tìm thấy chức năng cơ bản này để được nhiều hơn đủ - Tôi chỉ có thể sử dụng MACROS đến mức mà tôi muốn để lộ các lớp học của tôi để Reflection (vì vậy mà tôi không phải viết mã tấm nồi hơi). Máy phát điện của nhà máy cũng có vẻ rất mạnh (với cùng các macro ban đầu được thiết lập, bạn có thể hoán đổi trong bất kỳ máy phát điện nào mà bạn muốn tạo ra JSON, SOCI, hoặc luồng ...), nhưng có đường cong học tập lớn hơn/thiết lập, nếu bạn muốn viết máy phát điện của riêng bạn. Một vài lưu ý cuối cùng: với một số chỉnh sửa nhỏ, tôi đã có thể làm cho nó hoạt động với C++ 11 trên gcc 4.7.2; Ngoài ra, các tài liệu cũng đã được DOxygenated và dường như có nhiều hơn ví dụ đầy đủ để có được đi một cách nhanh chóng.
'std :: tuple' hehe –
Pubby
Tôi biết tôi sẽ ầm ĩ lên án vì cho rằng điều đó, nhưng tôi nghĩ rằng trong trường hợp này 'reinterpret_cast' sẽ làm việc trên hầu hết các nền tảng. –
@JamesBrock Boo! Tiếng xì xì! [Đề nghị của bạn xấu và bạn sẽ cảm thấy xấu] (http://www.youtube.com/watch?v=jG2KMkQLZmI)! –