Hãy tưởng tượng tôi có chức năng miễn phí sau đây và functor:Hàm/functors làm tham số mẫu. Chúng có thể được lưu trữ không?
void myFreeFunction(void)
{
cout << "Executing free function" << endl;
}
struct MyFunctor
{
void operator()(void)
{
cout << "Executing functor" << endl;
}
};
Như discribed bởi this answer, tôi có thể vượt qua chức năng hoặc functor tôi như là một mẫu đối số chức năng khác:
template <typename F>
void doOperation(F f)
{
f();
}
Và sau đó gọi:
doOperation(myFreeFunction);
doOperation(MyFunctor());
Cho đến nay rất tốt. Nhưng nếu tôi muốn một cái gì đó như sau:
template<typename Callback>
class MyClass
{
private:
Callback mCallback;
public:
MyClass(){}
void execute()
{
mCallback();
}
};
Trong trường hợp này tôi chỉ định chức năng/functor khi tôi khai báo lớp nhưng không gọi cho đến sau này. Nó hoạt động cho functors:
MyClass<MyFunctor> myClass1;
myClass1.execute();
Nhưng không phải cho các chức năng:
MyClass<myFreeFunction> myClass2;
myClass2.execute();
Compiler nói:
lỗi C2923: 'MyClass': 'myFreeFunction' không phải là một mẫu đối số kiểu hợp lệ cho thông số 'Gọi lại'
Điều này là hợp lý ... nhưng bạn sẽ thế nào cấu trúc này?
Lưu ý: Tôi biết về std :: function và có thể kết thúc bằng cách sử dụng tính năng này. Nó có thể đo được chậm hơn mặc dù vậy tôi đang xem xét tất cả các tùy chọn.
Cảm ơn,
David
sử dụng boost :: bind() và boost :: function(), bạn có thể thực hiện những gì bạn đang tìm kiếm. Nếu quan tâm, tôi có thể cung cấp một ví dụ. – Lou
Cảm ơn, nhưng như đã lưu ý ở phần cuối, tôi đã biết về std :: function như một giải pháp. Nó dường như có hiệu suất trên không mặc dù là kết quả của hàm không được inlined. – PolyVox