Представьте, что у меня есть следующие бесплатные функции и функтор:
void myFreeFunction(void)
{
cout << "Executing free function" << endl;
}
struct MyFunctor
{
void operator()(void)
{
cout << "Executing functor" << endl;
}
};
Как указано в этом ответе , я могу передать свою функцию или функтор в качестве аргумента шаблона другой функции:
template <typename F>
void doOperation(F f)
{
f();
}
А затем позвоните:
doOperation(myFreeFunction);
doOperation(MyFunctor());
Пока все хорошо. Но что, если я хочу что-то вроде следующего:
template<typename Callback>
class MyClass
{
private:
Callback mCallback;
public:
MyClass(){}
void execute()
{
mCallback();
}
};
В этом случае я указываю функцию / функтор, когда объявляю класс, но не вызываю его до тех пор, пока не позже. Работает для функторов:
MyClass<MyFunctor> myClass1;
myClass1.execute();
Но не для функций:
MyClass<myFreeFunction> myClass2;
myClass2.execute();
Компилятор говорит:
ошибка C2923: «MyClass»: «myFreeFunction» не является допустимым аргументом типа шаблона для параметра «Callback»
Что достаточно справедливо ... но как бы вы это структурировали?
Примечание: Я знаю о std :: function и могу использовать это. Хотя это заметно медленнее, поэтому я смотрю на все варианты.
Спасибо
David