как кэшировать лямбду в C++ 0x?

Я пытаюсь работать с лямбдой в 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.

7
задан Deduplicator 2 November 2016 в 08:46
поделиться

3 ответа

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

Этот код работает на GCC и VC10 (удалить tr1/ из include для 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);
}
7
ответ дан 6 December 2019 в 23:06
поделиться

Из Visual C++ Blog

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

3
ответ дан 6 December 2019 в 23:06
поделиться

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

std::function(std::string,int,bool)>

Не забудьте про auto (хотя массив auto сделать не удастся и т.д.)

.
1
ответ дан 6 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: