我們可以使用模板工作Lambda表達式&異常處理?是否可以使用模板和異常處理來表達lambda表達式/函數?
任何人都可以證明,在exapmle程序方面請?
是否可以使用模板表達lambda表達式/函數&異常處理?
編輯:我需要一個例子程序。「Lambda表達式/使用Functyions模板&異常處理」
我們可以使用模板工作Lambda表達式&異常處理?是否可以使用模板和異常處理來表達lambda表達式/函數?
任何人都可以證明,在exapmle程序方面請?
是否可以使用模板表達lambda表達式/函數&異常處理?
編輯:我需要一個例子程序。「Lambda表達式/使用Functyions模板&異常處理」
你可以傳遞一個lambda爲模板。最簡單的例子是std::for_each
:
std::vector<int> v;
for(int i=0;i<10;++i)
{
v.push_back(i);
}
std::for_each(v.begin(),v.end(),[](int& i){i*=2;}); // double each value
std::for_each(v.begin(),v.end(),[](int i){std::cout<<i<<std::endl;}); // print each value
這將因此打印
0
2
4
6
8
10
12
14
16
18
您也可以從一個lambda拋出異常,外抓他們。例如
try
{
unsigned count=0;
std::for_each(
v.begin(),v.end(),
[&count](int i)
{
if(++count==5)
{
throw i;
}
std::cout<<i<<std::endl;
});
}
catch(int i)
{
std::cout<<"Caught "<<i<<std::endl;
}
與以前v
,這將然後打印
0
2
4
6
Caught 8
你不能有一個模板拉姆達,但你可以在模板中使用lambda:
template<typename T>
void f(std::vector<T> const& v)
{
std::for_each(
v.begin(),v.end(),
[](T const& t){std::cout<<t<<std::endl;}); // print each value
}
你不能直接模板拉姆達,但也許你可以做一個模板拉姆達工廠:
#include <functional>
template <typename T>
struct make_adder
{
static inline std::function<T(T,T)> create()
{
return [](T a, T b){ return a + b; };
}
};
甚至:
template <typename T> std::function<T(T,T)> make_adder
{
return [](T a, T b){ return a + b; };
}
然後你就可以創建幾個實例:
auto int_adder = make_adder<int>::create();
auto black_adder = make_adder<Black>::create();
不知道,如果你需要創建以這種方式lambda表達式,但如果你發現你做什麼,那麼模板可以通過這種包裝來實現。
是否有特殊的原因讓create()成爲模板化的類而不是模板化的全局函數的靜態方法?慣例? – mmocny
@mmocny:錯誤...沒有理由,我只是在「思考結構」模式。是的,一個功能就足夠了!讓我編輯。 –
Lambdas就像調用其他函數一樣工作,所以它們按預期工作,但有例外。你不能有一個模板lambda,儘管你可以傳遞一個lambda作爲模板參數。 –
@Cory:是的,他在23點給了一個模板的例子..但對我來說..iam的感覺...這是不夠的理解..你可以請解釋任何簡單的例子... – user751747
@user:給我,這是完全不清楚你在問什麼。你能提供一個你想要做什麼的具體例子嗎? –