2011-12-16 119 views
2

我想知道什么是下面介绍的拉姆达正确的类型定义,因此,下面的代码将编译使用兼容标准的C++编译器11: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; 
} 

回答

15

这是auto + decltype

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

每一个lambda都有一个不同的,唯一的未命名类型。你作为一个编码器,只是不能命名。

然而,在你的情况下,由于拉姆达没有捕获任何(空[]),它是隐式转换为一个指针到函数,所以这会做:

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

这是std::function<bool(int)>。或者可能只是bool(*)(int)如果你愿意,因为lambda不捕获。

(原始函数指针可能会多一点效率,因为std::function做(至少在某些情况下)需要某种类型的擦除神奇的动态分配。)

+0

原始函数指针提示工作很好thanx!+1 – 2011-12-16 00:57:08

+0

顺便说一句如果我要通过引用'[&]'捕获所有内容,它会是什么样子? – 2011-12-16 01:01:35