3

私は自分が何をしているのかをあまり考えずに次のコードを書きましたが、それが実際に意図したとおりに機能することに本当に驚いています。

誰かがバインドが深いパラメータで機能する理由と方法を説明できますか?

#include <string>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
using namespace placeholders;

int main()
{
    vector<string> s = { "abc", "aaaaaaa", "c" };

    for_each(s.begin(),s.end(),
             bind(printf,"string length is %d\n",bind(&string::length,_1)));
}
4

2 に答える 2

3

標準は単項型特性を定義します。これは、 が から返された呼び出しラッパー型である場合、または特性がユーザー定義型に特化されている場合にis_bind_expression<T>trueになります。Tstd::bind()

呼び出しラッパーが呼び出されると、そのバインドされた引数のいずれかがバインド式 ( によって決定されるis_bind_expression) である場合、そのネストされたバインド式は、外側の式が呼び出されたときと同じすべての引数で呼び出されます。ネストされたバインド式は、プレースホルダーを持つ任意の引数を選択できます (_1例では)。これは再帰的に行われるため、内部バインド式を呼び出すと、そのバインドされた引数のいずれかがバインド式であるかどうかもチェックされ、同じ引数のセットでそれらが呼び出されます。

于 2012-12-17T18:39:19.063 に答える
2

これがどのように行われるのか正確にはわかりませんbindが、区別がつく場合は謎ではありません。

のタイプはbind、その入力タイプによって異なります。したがって、入力型として abindを持つ a は、戻り値の型_1で消費するという事実に注意できます_1(実際、これは非常に理にかなっています)。 bindまた、この事実 (パラメーターにバインド_1されていないという事実) をそのパラメーターから抽出することもできます。

std::bindいくつかのドキュメントを引用するには:

std::is_bind_expression::value == true (つまり、別の sbind 部分式が bind の最初の呼び出しで引数として使用された) の場合、その bind-subexpressin がすぐに呼び出され、その結果が呼び出し可能なオブジェクトに渡されます。バインド部分式にプレースホルダー引数がある場合、それらは u1、u2、... から選択されます。

于 2012-12-17T16:12:06.737 に答える