2009-08-03 8 views
8

最近、私はVC2010のラムダのサポートについて非常に興奮してきました。私はゆっくりと、この機能がC++をより良いものに変えてくれる可能性を十分に理解し始めています。C++のライブラリプランは0xですか?

しかし、この可能性は、ブーストやQTのような日々のライブラリーのラムダのメインストリームのサポートに大きく依存することに気付きました。
C++ 0xの新機能でこれらのライブラリを拡張する予定があるのか​​知っていますか?

ラムダは、boost :: lambdaと、それと相互作用するブーストのすべてを実質的に置き換えるものです。 QTはすべてのコンテナにラムダのサポートを追加することができます。SLOT

+1

'後押し:: bind'はラムダに置き換えられていない別のものを対象としています。 'std :: bind'は、束縛関数の仕事をします。代わりに、lambdaは 'boost :: lambda'(およびその後継のboost :: phoenix、afaik)の機能を部分的に置き換えます。ラムダが現在行えないことは、 'boost :: lambda'の多型です。任意の引数型で動作する関数を作成する能力: '_1 ++'は任意の引数型をインクリメントし、 '[](int&a){a ++; } 'はintをインクリメントするだけです。概念がC++のものではなくなったと聞きました。多形ラムダはもう一度オプションです。 –

+1

@litb - 興味深いのは、コンセプトがラムダのタイプパラメータでの障害となった理由を説明する資料へのリンクがありますか? –

+0

私は詳細に議論している論文は知らないが、私はそれをユーズネットで読む。ラムダの 'operator()'テンプレートを拘束するために、 'Blah [](T t){...}'かこれに類するものが必要であると言う方法があったはずです。別の問題は、制約のあるテンプレートでは、他の制約付きテンプレートを呼び出すだけで、テンプレート定義を型チェックできるということです。だから、単純なunconstainedテンプレート 'operator()'を持つラムダでは、このような制約テンプレートでは使えません:template void f(T t){([](u){...}) (t)とする。 } '。 –

答えて

6

Lambdaは既に既存のライブラリ(関数がテンプレートパラメータによって与えられた型の関数オブジェクトを受け入れる場所)に非常に良く適合しています。

これは素晴らしいことの1つです。これは、既存の方法を素晴らしい構文でコード化する言語機能の古典的な例です。

明らかに、ブーストラムダライブラリーは冗長になりますが、それはそれに新たな機能を追加する必要がないことを意味します。

+0

downvoterからのコメントは興味深いかもしれません(しかし、再び、そうではないかもしれません)。 –

+0

これは、あなたのクッキーカッターダウン投票のコメントですか? :P – GManNickG

3

関連するC++ 0x機能のコンパイラサポートが適切になるまで待つことになります。主流のコンパイラがそれをサポートするまでそれほど気にしないでください。あなたの息を止めないでください。

4

ラムダの使用がライブラリによるサポートにどのように依存するのかわかりません。 Lambdasは、小さな小さなアルゴリズムをラップし、他の言語/ライブラリ機能と一緒にきれいにまとめるために、多くのクラスを作成する必要性を排除します(std::function)。関数オブジェクトまたは関数ポインタのいずれかを渡すときは、lambdaも使用できます。

したがって、主に既存のコードとライブラリを使用するための別の方法が追加されています。ラムダをよりよくサポートするためにライブラリで見ることができる唯一の方法は、より機能的なスタイルのアプローチを使用することです。

0

ほとんどのライブラリは、コールバックに標準の関数ポインタを使用します。 C++ 0x lambdasは関数ポインタとして使用できるので、ほとんどのライブラリは変更する必要はありません。他のライブラリはテンプレートを使用しているため、呼び出し可能なオブジェクトをすべて取り込めます(std::foreachは変更する必要はありません)。

私がそのライブラリを考えることができる唯一の他のC++ 0x機能は、強く型付けされたenumsを使用するように変更される可能性があります。また、ライブラリでは、externテンプレートを使用してコンパイル時間を短縮する可能性があります。

+3

r値参照は大きな影響を及ぼします(または、すべきです) - ライブラリの多くは、構築するのに費用がかかるリソースの周りのラッパーとして機能するクラスを持ち、移動操作の追加は、ライブラリ(または正しいプログラムをもっと読みやすくする)。 –

+0

ああ、はい、私はR値の参照を忘れていました。私は彼らがBoostのようなライブラリで多く使われるだろうと思っていますが、Qtのようなアプリケーション指向のライブラリではそれほど多くはありません。また、ほとんどの場合、インターフェースを壊すことはありませんので、心配する必要はありません(自分のコードで使用する場合を除く)。 – Zifre

+1

ラムダ式の結果を関数ポインタに代入することはできません。 – sellibitze

1

これは当てはまりません。boost :: lambdaをC++ 0x lambdaに置き換えることはできません。何らかの理由でhereを参照してください(ブーストバインドについては、ほとんどの場合転送すると思います)。

また、@ダニエルthisは、スロットのラムダ関数/ブーストバインドの使用を開始するのに役立ちます。それは私の人生を信じられないほど簡単にします。

また、私の情報源からの@litb、ラムダを変更するつもりはありません(なんてこった)

+0

リンクcheezのおかげです! –

+0

ループ変数をクローズしてコピーを作成するという醜い問題については、代わりに 'for_each'を使って'ベクトル 'をループしてください。ラムダを渡して、 "for_each(d.begin()、d.end()、[&](int i){/ *ループボディをここに入れる* /});すでに ''コピーされているので、 ''私は値で安全に取り込むことができるので、 '' funcs.push_back([=](){return i + 5;}); 'と言うでしょう。同じ問題や解決策がC#とJavaScriptで発生します。 –

関連する問題