3

C++ で h​​ttp サーバーのラッパーを作成しています。私のコンパイラは C++03 (gcc 4.1.2) しかサポートしておらず、boost を使用できません。

関数、オブジェクト メソッド、または静的オブジェクト メソッドのいずれかを登録できる、一般化されたコールバック メカニズムを実装してリクエストに応答したいと考えていました。

<functional>関数オブジェクト (C++03、http://www.cplusplus.com/reference/functional/ ) を(あまりにも) ざっと見てみると、それが答えだと思いました。

ただし、<functional>関数オブジェクトは一般化されたコールバック メカニズムを提供することを意図していないようです。

だから私は疑問に思います: <functional>C++03 での関数オブジェクトの使用は何ですか? 彼らは何のために意味されていますか?単純な関数ポインタよりも優れていると思われる真の利点は何ですか? それとも、C++03 バージョンに欠陥があり、C++11 バージョンだけが実際に役立つのでしょうか?

[編集] 私が最初に理解した限りでは、C++03 の関数オブジェクトは、関数ポインタをラップする無駄なものにすぎないように思えました。それでは、関数ポインタを直接使用したいと思います。この間違った分析を正すことが、この質問のポイントです。

4

1 に答える 1

2

あなたの質問はよくわかりません<functional>。メカニズムではなくヘッダーです。ヘッダーは、関数オブジェクトを便利に作成するためのユーティリティを提供します。簡単な例として、transform を呼び出して、ある範囲の要素を別の範囲で乗算し、その結果を 3 分の 1 に格納するとします。次のような関数を定義できます。

double mult(double lhs, double rhs) { return lhs * rhs; };

次に、次のように呼び出します。

std::transform(lhs.begin(), lhs.end(), rhs.begin(), out.begin(), mult);

またはstd::multiplies、すでに定義されている を使用できます。

std::transform(lhs.begin(), lhs.end(), rhs.begin(), out.begin(), std::multiplies<double>());

他にもたくさんの例があります。あなたはただ創造的である必要があります。C++11 ラムダでは<functional>、関数の呼び出しとインラインで関数を定義するだけでよいため、多くの機能が廃止されたか、少なくともあまり役に立たなくなりました。

リクエストに応答する一般化されたコールバック メカニズムを実装したかった

の C++03 バージョンで<functional>は、これは役に立ちません。C++11 バージョンは、 をstd::functionから採用したものboost::functionです。

于 2013-02-01T09:30:51.230 に答える