2010-12-01 5 views
2

LambdaのC++での退屈なパラメータ宣言を単純化する方法0x?

#include <vector> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
    vector<int> coll; 
    for_each(coll.begin(), coll.end(), [](vector<int>::value_type n) -> void {}); 

    return 0; 
} 
#include <vector> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
    vector<int> coll; 
    for_each(coll.begin(), coll.end(), [](vector<int>::value_type n) -> void {}); 

    return 0; 
} 

vector<int>::value_type nここで、vector<int>::value_type nは面倒です。私は自動的に正しいタイプのnを推論するための自動のようなユーティリティを持っています。次のようにしてください:

for_each(coll.begin(), coll.end(), [](auto_type n) -> void {}); 

もっと貪欲になるためには、auto_typeに正しいタイプのnを推論するための引数が必要です。引数は、(スマートな)ポインタまたはコンテナへの参照、またはコンテナのイテレータになります。

親愛なる親愛なる人、それをどうやって実装するのですか?

答えて

2

この関数でvoid returnを宣言する必要はありません。あなたはdecltype(coll[0])のようなdecltypeを使うことができます。

std::for_each(coll.begin(), coll.end(), [](decltype(coll[0]) value) { 
    std::cout << value; 
}); 

編集:あなたはすでにそれらが同一である知っているようにあなたは、int型の代わりにベクトル<のint> :: VALUE_TYPEを書くべきではありません

template<typename T> auto type(T&& t) -> decltype(*std::forward<T>(t).begin()) { 
    return *t.begin(); 
} 
std::for_each(coll.begin(), coll.end(), [](decltype(type(coll)) value) { 
}); 
+1

コンテナがベクトル状でない場合、decltype(coll [0])は無効です。このソリューションはあまり一般的ではありません。 decltype(* coll.begin())はあまりにも醜いです。 – xmllmx

+0

時々、イテレータfor_each(firs、last、[](??? value) - > void {})を保持するだけです。このような場合auto_typeはどうですか? – xmllmx

+0

@xmllmx:あなたは、coll.begin()の簡単なヘルパーを書くことができます。この場合、何らかのauto_typeを記述する際の問題は、ラムダやそのoperator()をテンプレート化できないことです。ここで一般的な答えを得ることは非常に疑問です。 – Puppy

1

。より良い例が助けになるでしょう。私はまた、より単純なラムダパラメータを望みます。

しかし、パラメータタイプを推論することは、ラムダの使用方法に依存し、for_eachの詳細を知ることによってのみ知ることができます。しかし、関数のオーバーロードの解決は、パラメータの型を知ることによって決まります。そのため、パラメータの型は関数の使用方法に依存できません。現在のC++では

、あなたはそのパラメータの型からファンクタタイプを切り離すことによって、この循環依存を避ける:

struct AddExample { 
    template<class T> 
    T operator()(T a, T b) { 
    return a + b; 
    } 
}; 

some_algo(begin, end, AddExample()); 

同等のいくつかのセマンティクスをいじるの費用で、ラムダ構文のために行うことができる(例えば、暗黙的な関数ポインタとstd :: functionへの変換)ですが、C++ 0xではそれは起こっていません。次のようにラムダ提案の

0

初期のバージョンでは、単純な構文を持つ、いわゆる多型ラムダのための引当金を、含ま:

auto print = [](x) { std::cout << x; }; 
print(42); 
print("foo"); 

は残念ながら、技術的な問題は、委員会が持っていることができなかったと感じた提案でした既に非常に厳しいスケジュールで満足に解決されているので、破損した可能性のある機能を標準化する代わりに、多形ラムダの導入を将来の標準改訂に延期しました。

関連する問題