2012-12-15 30 views
6

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.

+0

'std :: tuple ' hehe – Pubby

+0

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. –

+1

@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)! –

Trả lời

6

Tôi không nghĩ rằng có cách để thực hiện việc này trong C++.

Tôi không biết cách liệt kê các trường/loại trong cấu trúc - nếu bạn có thể làm điều đó, tôi sẽ nghĩ rằng việc xây dựng một bộ túp như vậy sẽ khá đơn giản.

Tôi tin rằng Boost.Fusion có một macro giúp với điều này được gọi là FUSION_ADAPT_STRUCT, nhưng đó là tất cả các hướng dẫn sử dụng.

Thuật ngữ kỹ thuật cho điều này là "phản chiếu" và bạn có thể tìm thấy nhiều thông tin về nó bằng cách tìm kiếm "Phản chiếu C++".

Dưới đây là một bài viết như: How can I add reflection to a C++ application?

+0

+1 để có thông tin chi tiết và các liên kết hữu ích – kfmfe04

+0

trông giống như cho đến khi C++ được phản chiếu, một số thư viện này sẽ làm (ít nhất nó sẽ ngăn chặn tấn mã soạn sẵn). – kfmfe04

Các vấn đề liên quan