Как получить тип лямбда-выражения c ++ 0x? - PullRequest
4 голосов
/ 21 февраля 2011

Я хочу получить тип лямбды в качестве аргумента шаблона. Как это сделать?

template<class T>
class Foo
{
public:
    Foo(T t){ t(); }
};

int main()
{   
    Foo< type?? > foo([](){ cout<<"construct OK"; });

    system("pause");
    return 0;
}

Ответы [ 2 ]

10 голосов
/ 21 февраля 2011

Можно вывести тип лямбда-выражения, если он является аргументом для параметра функции шаблона функции, тип которого выводится.

Лямбда-выражения, однако, явно запрещены для появления внутри неоцененного операнда - включая decltype. Было обнаружено, что это включает в себя несколько еще не обработанных особых случаев, и было обнаружено, что нет реальной утилиты, позволяющей использовать лямбда-выражения внутри decltype и друзей. Напомним, что каждое лямбда-выражение создает новый уникальный тип.

Вместо этого вы можете использовать std::function<void()>, который может хранить любой объект функции, который может быть вызван без аргументов, и возвращает void в качестве возвращаемого типа.

Foo< std::function<void()> > foo([](){ cout<<"construct OK"; });

Конечно, как я уже говорил выше, шаблоны функций могут определять тип аргумента, поэтому вы также можете сделать конструктор шаблоном

class Foo
{
public:
    template<typename T>
    Foo(T t){ t(); }
};

Foo foo([](){ cout<<"construct OK"; });

Но я полагаю, что это не очень полезно в вашем случае, так как вы, вероятно, хотите что-то сделать с T в вашем определении класса. Например, хранение объекта как нестатического члена данных. С std::function это возможно.

1 голос
/ 21 февраля 2011

Все еще существует старомодный способ использования функций для определения типов:

template<class T>
class Foo
{
public:
    Foo(T t){ t(); }
};

template <typename T>
Foo<T> make_foo(T const& t)
{
    return Foo<T>(t);
}

... make_foo([](){ cout<<"construct OK"; });

но я думаю, компиляторы, которые поддерживают лямбда-выражения, обычно также поддерживают decltype и auto, поэтому ответ Маттео, вероятно, лучше.

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