2010-11-20 42 views
17

Tôi hiện đang viết dự án lớn trong C++ 11.Thư viện phản chiếu C++ 11

Tôi đang tìm kiếm một thư viện phản xạ C++ 11/C++ và tôi đã tìm thấy một số thư viện khác nhau, nhưng hầu hết trong số chúng không được cập nhật trong vài năm qua hoặc chức năng của chúng rất hạn chế.

Bạn có thể cho tôi biết nếu có thư viện thực sự tốt cho C++ 1/C++ để phản ánh không? (Tôi muốn có phản xạ tĩnh và động, biết nhiều thông tin nhất có thể về phương pháp, lớp học, vv, có thể tự động thêm và truy cập các phương pháp, v.v.)

Hoặc có thể C++ 11 cung cấp một số chức năng bổ sung để thiết kế thư viện phản chiếu tốt hơn và tôi có nên tự viết nó không? (Tuy nhiên, tôi chưa tìm thấy thông tin về nó.)

+8

Dường như thiết kế của bạn không khớp với lựa chọn ngôn ngữ của bạn. – ybungalobill

+0

Đây là [câu hỏi tương tự] (http://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-a-c-application). Tôi cũng tìm kiếm và tìm thấy [CAMP] (https://github.com/tegesoft/camp). Tôi có một [ngã ba] (https://github.com/billyquith/camp) sẽ loại bỏ sự phụ thuộc Tăng và sử dụng C++ 11 để thay thế. – Nick

+0

Tôi không chắc chắn điều này đã thay đổi như thế nào qua nhiều năm, nhưng bạn có thể hoàn thành một số tính năng phản chiếu thông qua thiết kế cẩn thận. Ví dụ: mẫu trang trí để thêm/sửa đổi hành vi tại CT hoặc RT (https://en.wikipedia.org/wiki/Decorator_pattern); SFINAE để phát hiện một chức năng tại CT https://stackoverflow.com/a/29319078/1043529; dep. đảo ngược (https: //en.wikipedia.org/wiki/Dependency_inversion_principle) để tìm các phương thức cụ thể (CRTP và static_cast cho CT, dynamic_cast cho RT) và hơn thế nữa. Phản ánh đầy đủ cho các loại thực sự tùy ý? Chọn trận chiến của bạn, điều này là một trong những khó khăn. –

Trả lời

9

C++ không thực sự là ngôn ngữ tốt nhất để phản ánh. C++ 0x không thực sự thay đổi điều đó. Bạn có thể nhận được hỗ trợ hạn chế cho phản xạ tĩnh bằng cách sử dụng các đặc điểm kiểu và thậm chí bạn có thể sử dụng SFINAE để xác định tĩnh xem một lớp nhất định có một hàm thành viên cụ thể hoặc biến thành viên hay không. Nhưng đó thực sự là nó.

Phản ánh động bị hạn chế nghiêm trọng. Bạn có thể lấy kiểu của một lớp trong thời gian chạy bằng cách sử dụng các cơ sở <typeinfo>, nhưng đó là về nó.

Đối với phản xạ tĩnh, khả năng lặp lại chung trên một lớp và nhận được từng biến/chức năng của thành viên là không thể nếu không có sự thỏa hiệp nghiêm trọng. Boost.Fusion quản lý để kéo điều này bằng cách cung cấp các macro cho phép bạn liên kết một đối tượng với một thùng chứa giống như bộ đồ. Trên thực tế, lớp std::tuple hoặc boost::tuple tự nhiên cung cấp sự phản ánh thời gian biên dịch - nói cách khác, bạn có thể lặp lại tĩnh trên một bộ dữ liệu và xác định loại của từng thành viên. Điều này cung cấp cho bạn một cái gì đó gần đúng phản ánh thời gian biên dịch trên các loại tổng hợp tùy ý. Thật không may, nó không phải là thuận tiện như nếu có hỗ trợ phản ánh bản địa được xây dựng trong cho các lớp tùy ý.

5

Dường như có thư viện thỏa mãn các yêu cầu "rộng" của bạn. Hãy xem Mirror: Boost.Mirror. Lưu ý rằng nó là chính thức KHÔNG một phần của tăng. Bạn cũng có thể xem các thư viện khác: Reflective Programming.

+0

Cảm ơn bạn! Điều này thực sự thú vị, tôi sẽ xem xét nó gần hơn :) –

+0

+1 trông thực sự tốt - với một vài chỉnh nhỏ, có vẻ như làm việc với gcc 4.7.2 – kfmfe04

3

QT có hình thức phản chiếu nguyên thủy, có thể bạn muốn lấy một món đồ ở đó.

+0

Ok tôi sẽ :) Tại sao nó là nguyên thủy? –

+0

Vâng, nó là xa sự linh hoạt của các ngôn ngữ khác, chẳng hạn như java và C#. Nó cũng chỉ hoạt động trên các lớp kế thừa từ QObject. Tôi không biết về những hạn chế khác. –

3

Cũng tùy thuộc vào những gì bạn đang sau, bạn có thể xây dựng ontop của riêng bạn của python và clang python bindings. Có một vài ví dụ trên mạng, chẳng hạn như của riêng tôi https://github.com/nevion/metapod - những thứ khác tồn tại nếu bạn nhặt rác đủ cứng và theo cách này, công cụ MOC của Qt đang làm - ngoại trừ tiếng kêu làm cho công việc trở nên dễ dàng hơn nhiều. Một trong những điều thú vị về phương pháp này là nó hoạt động cho tất cả các trình biên dịch bởi vì bạn chỉ tạo mã tiêu chuẩn với các mẫu mako - nhưng điều này cũng có nghĩa là nó không hoàn toàn tự động - vì vậy có một sự cân bằng và nó sẽ không xử lý mọi metaprogramming/nhu cầu phản chiếu. Như Charles Salvia đã nói, C++ không phải là ngôn ngữ tốt nhất để phản ánh nên bạn phải lấy những gì bạn có thể nhận được.

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