Создание экземпляра лямбды С++ по ее типу

Мне нужен способ сделать функтор из функции. Сейчас я пытаюсь обернуть вызов функции лямбда-функцией и создать ее экземпляр позже. Но компилятор говорит, что конструктор лямбда удален. Так есть ли способ скомпилировать этот код? Или, может быть, другой способ для этого?

#include <iostream>  

void func()
{
    std::cout << "Hello";
}

auto t = []{ func(); };
typedef decltype(t) functor_type;

template <class F>
void functor_caller()
{
    F f;
    f();
}

int main()
{
    functor_caller<functor_type>();
    return 0;
}

Теперь я получаю такую ​​ошибку компилятора:

error: use of deleted function  '<lambda()>::<lambda>()'

error: a lambda closure type has a deleted default constructor

На мой взгляд, единственный способ - использовать макрос:

#define WRAP_FUNC(f) \
struct f##_functor       \
{                       \
    template <class... Args >                             \
    auto operator()(Args ... args) ->decltype(f(args...)) \
    {                                                     \
        return f(args...);                                \
    }                                                     \
};

, затем

WRAP_FUNC(func);

, а затем (в основном)

functor_caller<func_functor>()
21
задан Griwes 17 June 2012 в 19:38
поделиться