c++ 11 lambda和模板专门化

C++11 lambda and template specialization

本文关键字:专门化 lambda c++      更新时间:2023-10-16

我想知道下面给出的lambda的正确类型定义是什么,以便使用一致的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;
}

auto + decltype:

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

每个lambda都有一个不同的、唯一的、未命名的类型。你,作为一个程序员,只是不能命名它。

然而,在您的情况下,由于lambda没有捕获任何内容(空[]),因此它可以隐式地转换为指向函数的指针,因此可以这样做:

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

std::function<bool(int)>。如果您喜欢,也可以只使用bool(*)(int),因为lambda无法捕获。

(原始函数指针可能更有效一点,因为std::function确实(至少在某些情况下)需要动态分配一些类型擦除魔法。)