Тип параметра/хранилища для лямбда-выражения C++11

Как в C++11 объявить функцию, которая принимает лямбда-выражение в качестве аргумента? Я могу найти множество ресурсов в Интернете для объявления лямбда-выражений или использования их в качестве параметров шаблона, но что мне действительно хотелось бы сделать, так это иметь возможность использовать лямбда-выражения в качестве легко объявляемых обработчиков обратного вызова, подобных тому, что стало возможным благодаря замыканиям. в JavaScript и блоки кода в Objective-C.

По сути, классическая конструкция C++, которую я хочу заменить лямбда-выражением, выглядит примерно так:

class MyCallback {
public:
    virtual ~MyCallback() {}
    virtual void operator(int arg) = 0;
};

void registerCallback(const std::shared_ptr<MyCallback> &);

void foo(void) {
    int a, b, c;
    class LocalCallback: public MyCallback {
        int a, b, c;
    public:
        LocalCallback(int a, int b, int c): a(a), b(b), c(c) {}
        void operator(int arg) { std::cout << (a+b+c)*arg << std::endl; }
    };
    registerCallback(std::shared_ptr<MyCallback>(new LocalCallback(a,b,c)));
}

, которая может быть упрощена до:

void registerCallback(/* WHAT GOES HERE? */);

void foo(void) {
    int a, b, c;
    registerCallback([=](int arg){std::cout << (a+b+c)*arg << std::endl; })
}

Итак, что происходит там, где я написал /* ЧТО ЗДЕСЬ? */?

РЕДАКТИРОВАТЬ: Это сделано с целью сохранения обратного вызова, который будет вызван позже, а не для его немедленного потребления и вызова.

11
задан fluffy 25 May 2012 в 00:13
поделиться