C ++ 11 лямбда и специализация на шаблонах - PullRequest
3 голосов
/ 16 декабря 2011

Я хотел бы знать, каково правильное определение типа для лямбды, представленное ниже, так что следующий код будет компилироваться с использованием соответствующего компилятора c ++ 11:

#include <cstdio>
#include <string>

template<class Func>
class foo
{
public:
   foo(Func func)
   : fum(func){}
   Func fum;
};

int main()
{
   foo<???> fi([](int i) -> bool { printf("%d",i); return true; });
   fi.fum(2);
   return 0;
}

Я полагаю, что это можно сделать так:

template<typename Func>
foo<Func> make_foo(Func f)
{
   return foo<Func>(f);
}

int main()
{
   auto fi = make([](int i) -> bool { printf("%d",i); return true; });
   fi.fum(2);
   return 0;
}

Ответы [ 2 ]

15 голосов
/ 16 декабря 2011

Это auto + decltype:

auto l = [](int i) -> bool { printf("%d",i); return true; };
foo<decltype(l)> fi(l);
fi.fum();

Каждый лямбда имеет свой уникальный, безымянный тип.Вы, как кодер, просто не можете назвать его.

Однако, в вашем случае, поскольку лямбда ничего не захватывает (пусто []), она неявно конвертируетсяуказатель на функцию, так что это будет делать:

foo<bool(*)(int)> fi([](int i) -> bool { printf("%d",i); return true; });
fi.fum();
7 голосов
/ 16 декабря 2011

Это std::function<bool(int)>.Или, возможно, просто bool(*)(int), если хотите, поскольку лямбда не захватывает.

(необработанный указатель функции может быть немного более эффективным, поскольку std::function (по крайней мере, в некоторых случаях) требует динамическоговыделение для некоторого типа магии стирания.)

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