2011-07-13 25 views
-1

我們可以使用模板工作Lambda表達式&異常處理?是否可以使用模板和異常處理來表達lambda表達式/函數?

任何人都可以證明,在exapmle程序方面請?

是否可以使用模板表達lambda表達式/函數&異常處理?

編輯:我需要一個例子程序。「Lambda表達式/使用Functyions模板&異常處理」

+2

Lambdas就像調用其他函數一樣工作,所以它們按預期工作,但有例外。你不能有一個模板lambda,儘管你可以傳遞一個lambda作爲模板參數。 –

+0

@Cory:是的,他在23點給了一個模板的例子..但對我來說..iam的感覺...這是不夠的理解..你可以請解釋任何簡單的例子... – user751747

+0

@user:給我,這是完全不清楚你在問什麼。你能提供一個你想要做什麼的具體例子嗎? –

回答

3

你可以傳遞一個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 
} 
0

你不能直接模板拉姆達,但也許你可以做一個模板拉姆達工廠:

#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表達式,但如果你發現你做什麼,那麼模板可以通過這種包裝來實現。

+0

是否有特殊的原因讓create()成爲模板化的類而不是模板化的全局函數的靜態方法?慣例? – mmocny

+0

@mmocny:錯誤...沒有理由,我只是在「思考結構」模式。是的,一個功能就足夠了!讓我編輯。 –