2011-12-16 98 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