Если вы хотите, чтобы член класса был лямбда-выражением, рассмотрите возможность использования типа оболочки std::function<>
(из заголовка <functional>
), который может содержать любую вызываемую функцию.Например:
std::function<int()> myFunction = []() { return 0; }
myFunction(); // Returns 0;
Таким образом, вам не нужно знать тип лямбда-выражения.Вы можете просто сохранить std::function<>
соответствующего типа функции, и система шаблонов будет обрабатывать все типы для вас.В более общем смысле любой вызываемый объект соответствующей сигнатуры может быть назначен на std::function<>
, даже если фактический тип этого функтора является анонимным (в случае лямбда-выражений) или действительно сложным.
Тип внутришаблона std::function
должен быть тип функции, соответствующий функции, которую вы хотите сохранить.Так, например, чтобы сохранить функцию, которая принимает два int
s и возвращает void, вы должны сделать std::function<void (int, int)>
.Для функции, которая не принимает параметров и возвращает int
, вы должны использовать std::function<int()>
.В вашем случае, так как вам нужна функция, которая не принимает параметров и возвращает void
, вам нужно что-то вроде этого:
class MyClass {
public:
std::function<void()> function;
MyClass(std::function<void()> f) : function(f) {
// Handled in initializer list
}
};
int main() {
MyClass([] {
printf("hi")
}) mc; // Should be just fine.
}
Надеюсь, это поможет!