2011-07-13 11 views
-1

テンプレートでラムダ式を操作できます&例外処理ですか?テンプレート&例外処理を使用してラムダ式/関数を表現することは可能ですか?

exapmleプログラムの点で誰でも表示できますか?

テンプレート&例外処理を使用してラムダ式/関数を表現することはできますか?

編集:私は、サンプルプログラムを必要とする..「テンプレートに&例外処理を使用してラムダ式/ Functyions」

+2

Lambdasは他のファンクタを呼び出すのと同じように動作するため、例外を想定して動作します。テンプレートの引数としてラムダを渡すことはできますが、テンプレートのラムダは使用できません。 –

+0

@コーリー:23ポイントで彼はテンプレートを使って例を挙げましたが、私のために...気持ちは分かりません。私は簡単な例を説明してください... – user751747

+0

@user:私にあなたが何を求めているのかは完全には不明です。あなたは何をしようとしているの具体的な例を提供することができますか? –

答えて

3

あなたがテンプレートにラムダを渡すことができます。最も単純な例は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 

を印刷します。例えば以前v

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; 
} 

、これはその後、

0 
2 
4 
6 
Caught 8 

を出力しますあなたは、テンプレートラムダを持つことはできませんが、テンプレート内ラムダを使用することができます。

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(); 

わからないが、しかし、あなたはあなたが見つけた場合、そのようなラッパーによってテンプレート化を達成することができます。

+0

テンプレート化されたグローバル関数ではなく、テンプレート化されたクラスを持つ静的メソッドをcreate()にする特別な理由はありますか?コンベンション? – mmocny

+0

@mmocny:Err ...理由はありません、私は "think struct"モードに入っていました。はい、関数で十分でしょう!私を編集させてください。 –

関連する問題