0

今日、私は c++11 のキャッチアップを行っていました (まだ先に進んでいないため)。多くの人が述べているように、切り替える理由の 1 つはラムダ式のようです。彼らがどのように新しいものを提供するのか、私はまだ確信が持てません。

たとえば、c++11 を使用する場合:

#include <iostream>

int main()
{
    auto func = [] () { std::cout << "Hello world" << std::endl; };

    func();
}

次のものに非常に似ているようです:

#include <iostream>

#define FUNC( )\
        do { std::cout << "Hello world" << std::endl; } while(0)


int main()
{
    FUNC();
}

ラムダ式は、現在まだ実行できないことを私に提供しますか?

4

2 に答える 2

6

http://msdn.microsoft.com/en-us/library/vstudio/dd293608.aspxは、このテーマに関する要点などを詳細にまとめています。ここに顕著な抜粋があります:

ラムダは、関数ポインターと関数オブジェクトの利点を組み合わせて、それらの欠点を回避します。関数オブジェクトと同様に、ラムダは柔軟性があり、状態を維持できますが、関数オブジェクトとは異なり、そのコンパクトな構文ではクラス定義は必要ありません。ラムダを使用することで、同等の関数オブジェクトのコードよりも煩わしくなく、エラーが発生しにくいコードを記述できます。

より多くの違いと比較を示すサイトの例があります。

また...従来の知識では、C++でマクロを使用することはありません。

http://scienceblogs.com/goodmath/2007/12/17/macros-why-theyre-evil/

于 2013-01-22T15:05:42.630 に答える
1

標準アルゴリズムでラムダを使用する場合の明らかでない利点は、プログラマーがラムダ関数の名前を考える必要がないことです。名前付けは、プログラミングでは難しい作業と見なされます

さらに、標準アルゴリズムを介して実行されるコードは、多くの場合、指定された範囲内の各オブジェクトでメンバー関数を呼び出すために使用され、ファンクターまたは関数の名前が付けられます。多くの場合、呼び出されるメンバー関数の名前をオウムして、コードの可読性に何も追加しません。考案された例:

struct object
{
    void execute() const {}
};

void run_execute(object const& o) { o.execute(); }

std::vector<object> v;

std::for_each(v.begin(), v.end(), run_execute);

std::for_each(v.begin(), v.end(), [](object const& o) { o.execute(); });

確かに、これはマイナーな利点ですが、それでも快適です。

于 2013-01-24T09:12:18.527 に答える