как кешировать лямбду в с ++ 0x? - PullRequest
7 голосов
/ 24 декабря 2009

Я пытаюсь работать с лямбдами в C ++ после того, как много их использовал в C #. В настоящее время у меня есть буст-кортеж (это действительно упрощенная версия).

typedef shared_ptr<Foo> (*StringFooCreator)(std::string, int, bool)
typedef tuple<StringFooCreator> FooTuple

Затем я загружаю функцию в глобальном пространстве имен в мой FooTuple. В идеале я хотел бы заменить это на лямбду.

tuplearray[i] = FooTuple([](string bar, int rc, bool eom) -> {return shared_ptr<Foo>(new Foo(bar, rc, eom));});

Я не могу понять, какой должна быть сигнатура функции для лямбда-кортежа. Это явно не указатель на функцию, но я не могу понять, какой должна быть лямбда-сигнатура. Ресурсы для лямбды сейчас довольно тонкие. Я понимаю, что C ++ 0x в данный момент находится в движении, но мне было интересно, как заставить это работать. Я также понимаю, что есть более простые способы сделать это, но я просто играю с C ++ 0x. Я использую компилятор Intel 11.1.

Ответы [ 3 ]

7 голосов
/ 24 декабря 2009

Оператор -> устанавливает тип возврата лямбды, в случае отсутствия типа возврата он может быть опущен. Кроме того, если это может быть выведено компилятором, вы можете опустить возвращаемый тип. Как сказал Терри, вы не можете назначить лямбду указателю на функцию (GCC неправильно разрешает это преобразование), но вы можете использовать std :: function.

Этот код работает на GCC и VC10 (удалите tr1 / из включений для VC):

#include <tr1/tuple>
#include <tr1/functional>
#include <tr1/memory>

using namespace std;
using namespace std::tr1;

class Foo{};
typedef function<shared_ptr<Foo>(string, int, bool)> StringFooCreator;
typedef tuple<StringFooCreator> FooTuple;

int main() {
    FooTuple f(
        [](string bar, int rc, bool eom) {
            return make_shared<Foo>();
        }
    );

    shared_ptr<Foo> pf = get<0>(f)("blah", 3, true);
}
3 голосов
/ 25 декабря 2009

Из Блог Visual C ++

Я упоминал о хранении лямбд в TR1 :: функции. Но ты не должен делать что если это не нужно, как tr1 :: function имеет некоторые накладные расходы. Если Вы хотите повторно использовать лямбду, или просто хотите дать ему имя, вы можете использовать авто.

1 голос
/ 24 декабря 2009

Вы должны иметь возможность хранить лямбда в std :: function. В вашем примере попробуйте сохранить его в

std::function<std::shared_ptr<Foo>(std::string,int,bool)>

Не забывайте об авто (хотя вы не сможете создать массив авто и т. Д.).

...