2010-08-19 42 views
8

Có cách nào để tạo một danh sách (ví dụ: một mảng) các con trỏ tới từng phương thức của một lớp C++ không?Lấy danh sách các phương thức của một lớp

Giống như Type.GetMethods() trong khuôn khổ .NET, nhưng chỉ sử dụng C++ chuẩn.

+7

Không, trừ khi bạn làm điều đó bằng tay. Và đó là một điều đáng sợ cần. Tại sao? – GManNickG

+0

@Gman: +1 cho "điều đáng sợ cần" –

+0

@GManNickG Tại sao không thể tạo danh sách các phương thức của lớp C++ bằng cách tạo ra một cây phân tích cú pháp của lớp? –

Trả lời

6

Không thể thực hiện điều này một cách tổng quát. C++ không có cơ sở hạ tầng siêu dữ liệu giống như .Net sở hữu.

Bạn có thể cung cấp cho chúng tôi trường hợp bạn muốn sử dụng thông tin này không? Có thể có cách tiếp cận tốt hơn bạn có thể sử dụng với C++

+0

Bởi bây giờ nó đã được chỉ ra khỏi tò mò.Ý tôi là, hôm qua tôi đã nghĩ về một số loại thư viện để xử lý dữ liệu JSON, nhưng hôm nay tôi không thể nhớ tại sao tôi lại nghĩ về cách tiếp cận này -_-. Vẫn còn câu hỏi vẫn còn, vì vậy tôi hỏi. –

+1

đó là minh hoạ tốt về cách ngôn ngữ khác nhau ngay cả khi cú pháp tương tự như vậy. Tâm lý của cách giải quyết vấn đề hoàn toàn khác nhau giữa hai ngôn ngữ. – tenfour

2

Tạo một bản sao của tệp .h và loại bỏ tệp đó trong trình chỉnh sửa.

Không, không có cách nào để tự động thực hiện.

0

Không có lớp meta trong các đối tượng và lớp C++, do đó không có sự phản ánh nào không được tham gia, vì vậy câu trả lời là không.

0

Bạn có thể nhận thông tin loại bằng cách sử dụng typeid nhưng không phải là thông tin về phương pháp.

3

Không có cách nào. Trong thực tế, ngay cả ở cấp mã đối tượng, một hàm thành viên lớp tĩnh không thể phân biệt với một hàm độc lập, cũng không phải một hàm thể hiện lớp từ một hàm độc lập truyền con trỏ tới một đối tượng.

Nếu bạn biết lược đồ mang tên trình biên dịch của bạn, và có quyền truy cập vào mã đối tượng được liên kết trước, bạn có thể giải mã được, nhưng đó là rất nhiều công việc cho kết quả không phù hợp.

+1

+1 cho phương pháp tiếp cận "thực hiện" được thực hiện "hardcore". – tenfour

1

Nếu bạn thực sự muốn làm điều này, chương 8 của nâng cao C++ Lập trình Styles và Thành ngữ James Coplien (có thể dài từ in ra, nhưng tôi nghe Neil sẽ sẵn sàng để bán bản sao của mình với giá rẻ) bao gồm lập trình với "exemplars" trong C++. Đừng nhầm lẫn, khả năng không đến miễn phí, nhưng nó có thể/cung cấp khả năng giống như metaclass trong C++.

Trái phép, tôi không nhớ khả năng cụ thể của anh ấy trong việc xây dựng một trong các lớp học của anh ấy, nhưng đã lâu rồi tôi mới đọc được cuốn sách đó một cách cẩn thận. Nó luôn luôn có thể rằng nó không thể được thực hiện ở tất cả, nhưng tôi nghĩ rằng nó sẽ làm việc, nếu bạn có thể sống với những hạn chế khác của những gì ông tiết lộ.

2

Trong dự án của mình, tôi sử dụng các macro đặc biệt để khai báo và xác định thành viên lớp học, sau đó Tôi có thể nhận danh sách các thành viên của lớp học. Ví dụ: khai

Class: định nghĩa

#define DECLARE_MODULE_FUNCTION(function_name) \ 
JsonObject function_name(JsonObject value); 

#define DEFINE_MODULE_FUNCTION(function_name) \ 
static ModuleFunctionAdder<LotteryOddsModule> \ 
__LINE__##function_name(L ## #function_name , &LotteryOddsModule::function_name); \ 
JsonObject LotteryOddsModule::function_name(JsonObject value) 

template< typename T > 
class ModuleFunctionAdder; 

class LotteryOddsModule 
{ 
public: 
    typedef JsonObject (LotteryOddsModule::*ModuleFunction)(JsonObject); 

    JsonValue Invoke(JsonValue json_value); 

    DECLARE_MODULE_FUNCTION(GenerateK1AndK2); 

private: 
    friend class ModuleFunctionAdder<LotteryOddsModule>; 
    static std::map< WString , ModuleFunction > _module_functions; 
}; 

template<> 
class ModuleFunctionAdder<LotteryOddsModule> 
{ 
public: 
    ModuleFunctionAdder(WString func_name , LotteryOddsModule::ModuleFunction func) 
    { 
     LotteryOddsModule::_module_functions[ func_name ] = func; 
    } 
}; 

Class:

JsonValue LotteryOddsModule::Invoke(JsonValue json_value) 
{ 
    return (this->*_module_functions[ L"GenerateK1AndK2" ]) (json_value.get_obj()); 
} 

DEFINE_MODULE_FUNCTION(GenerateK1AndK2) 
{ 
    //... 
} 
Các vấn đề liên quan