Vì vậy, tôi đang cố gắng tìm hiểu mẫu Lập trình meta tốt hơn và tôi hình dung đây là một bài tập tốt cho nó.
Tôi đang cố gắng viết mã có thể gọi lại một hàm với bất kỳ số lượng đối số nào tôi muốn chuyển cho nó.
// First function to call int add(int x, int y) ; // Second function to call double square(double x) ; // Third func to call void go() ;
Việc gọi lại mã tạo nên hình như:
// Write a callback object that // will be executed after 42ms for "add" Callback<int, int, int> c1 ; c1.func = add ; c1.args.push_back(2); // these are the 2 args c1.args.push_back(5); // to pass to the "add" function // when it is called Callback<double, double> c2 ; c2.func = square ; c2.args.push_back(52.2) ;
Những gì tôi đang suy nghĩ là, sử dụng mẫu Lập trình meta Tôi muốn để có thể tuyên bố callbacks như, viết một struct như thế này (hãy nhớ đây là giả RẤT)
<TEMPLATING ACTION <<ANY NUMBER OF TYPES GO HERE>> > struct Callback { double execTime ; // when to execute TYPE1 (*func)(TYPE2 a, TYPE3 b) ; void* argList ; // a stored list of arguments // to plug in when it is time to call __func__ } ;
vì vậy, khi gọi với
Callback<int, int, int> c1 ;
Bạn sẽ tự động được xây dựng cho bạn bằng cách < HARDCORE khuôn mẫu HÀNH ĐỘNG > một struct như
struct Callback { double execTime ; // when to execute int (*func)(int a, int b) ; void* argList ; // this would still be void*, // but I somehow need to remember // the types of the args.. } ;
Bất kỳ con trỏ đi đúng hướng để bắt đầu viết những dòng này?
Mẫu biến thể là một phần của C++ 0x. Một trình biên dịch hỗ trợ chúng (hoặc thậm chí là một trình biên dịch với hỗ trợ ít hơn C++ 0x) cũng sẽ bao gồm các đối tượng hàm C++ 0x và 'std :: bind', tương tự như' boost :: bind' và thực hiện những gì bạn đang nói về. – Potatoswatter