Шаблон C ++ 0x лямбда-функция ... или функтор / предикат? - PullRequest
3 голосов
/ 13 марта 2011

Я недавно обновил свой g++, чтобы я мог наслаждаться лямбда-функциями.Все отлично, и я очень благодарен тем, кто сделал это возможным в C ++ и gcc в частности.Есть только одна вещь, которую я не могу решить - как заставить аргументы лямбды быть шаблонными?Ниже приведены основные примеры использования лямбды для демонстрации проблемы.

Пример # 1, все вкусно:

#include <cstdio>

struct bar {
    bar () {}

    void say () {
        printf ("bar::say()\n");
    }

    void say () const {
        printf ("bar::say() const\n");
    }
};

template <typename T>
void do_work (const T & pred) {
    bar b;
    pred (b);
}

int main () {
    do_work ([] (bar & b) { b.say (); });
}

Теперь предположим, что do_work теперь вызывает предикат два раза с другим аргументомтипы.Итак, вот пример 2:

#include <cstdio>

struct foo {
    foo () {}

    void say () {
        printf ("foo::say()\n");
    }

    void say () const {
        printf ("foo::say() const\n");
    }
};

struct bar {
    bar () {}

    void say () {
        printf ("bar::say()\n");
    }

    void say () const {
        printf ("bar::say() const\n");
    }
};

template <typename T>
void do_work (const T & pred) {
    const foo f;
    bar b;
    pred (f);
    pred (b);
}

int main () {
    do_work ([] (auto & b) { b.say (); });
}

Примечание auto ключевое слово.Я также попытался создать шаблон на месте.Не пытайтесь скомпилировать это с помощью gcc, вот что я получаю:

./test.cpp:31:5: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

Но вы поняли идею.Я могу решить это с помощью нового стиля объявления функций, теоретически, но это не главное.Вот что я на самом деле пытаюсь сделать, но с упрощенным синтаксисом (foo, bar и do_work лишены простоты):

struct pred_t {
    pred_t () = default;

    template <typename T>
    void operator () (T && obj) const {
        obj.say ();
    }
};

int main () {
    do_work (pred_t ());
}

Есть ли способ или, по крайней мере,планируете добавить поддержку не полностью специализированных лямбда-функций, чтобы они действовали как предикат с template <typename T> operator () (T &&)?Я даже не знаю, как назвать это, может быть, лямбда-предикат?Пожалуйста, поделись своими мыслями!Спасибо!

Ответы [ 2 ]

5 голосов
/ 13 марта 2011

Они обсуждались как "полиморфные лямбды" и были отклонены, потому что это создавало проблемы с предложением концепций.

В прошлом году 2009 на совещании во Франкфурте предложение о концепции было отклонено из рабочего документа, но полиморфные лямбды больше не рассматривались для C ++ 0x,

См. C ++ 0x и отсутствие полиморфных лямбд .

1 голос
/ 13 марта 2011
do_work ([] (auto & b) { b.say (); });

Я думаю, что ключевое слово auto недопустимо в параметре function / lambda.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...