Функции/функторы как параметры шаблона. Можно ли их сохранить?

Представьте, что у меня есть следующая свободная функция и функтор:

void myFreeFunction(void)
{
    cout << "Executing free function" << endl;
}

struct MyFunctor
{
    void operator()(void)
    {
        cout << "Executing functor" << endl;
    }
};

Как описано в этом ответе, я могу передать свою функцию или функтор в качестве шаблона аргумент другой функции:

template 
void doOperation(F f)
{
    f();
}

А затем вызов:

doOperation(myFreeFunction);
doOperation(MyFunctor());

Пока все хорошо. Но что, если я хочу что-то вроде следующего:

template
class MyClass
{
private:
    Callback mCallback;

public:
    MyClass(){}

    void execute()
    {
        mCallback();
    }
};

В этом случае я указываю функцию/функтор, когда объявляю класс, но не вызываю его до тех пор, пока позже. Это работает для функторов:

MyClass myClass1;
myClass1.execute();

Но не для функций:

MyClass myClass2;
myClass2.execute();

Компилятор говорит:

ошибка C2923: 'MyClass' : 'myFreeFunction' не является допустимым аргументом типа шаблона для параметра 'Callback'

Что справедливо достаточно... но как бы вы это структурировали?

Примечание: Я знаю о std::function и в конечном итоге могу использовать это. Это заметно медленнее, поэтому я рассматриваю все варианты.

Спасибо,

Дэвид

7
задан Community 23 May 2017 в 12:31
поделиться