2

ターゲット オブジェクトに関する簡単な情報を生成する一連のメンバー関数がある状況があります。

double MyDoc::GetX(thing)
double MyDoc::GetY(thing)
etc.

同じクラスにいくつかの「整形式」メンバー関数を作成しました。

string MyDoc::PrintOne(thing, std::function<double (THING*)>)

pretty-printer 関数が data-function を取ることに気付くでしょう。つまり、ターゲットに関するさまざまなタイプの情報を作成し、「pretty print」文字列を生成できるように構成可能です。

直接使用すると、この手法は美しく機能します。

ただし、現在のアプリケーションで本当に必要なのは、そのようなエンティティの複数のレイヤーを構成することです。つまり、上記の構成全体のファンクター (関数オブジェクト) を効果的に作成して、pretty-printer 関数とそれがデータであることを指定できるようにします。取得関数、後でそれを呼び出します。パターンは z(x) -> f(x, g(x)):

auto Z = [&] (THING* thing) {
    return boost::bind(
        &MyDoc::PrintOne,
        this,
        _1,
        boost::bind(MyDoc::GetX, this, _1));
}

そして、ここで私は問題に遭遇します。私は正しい構文を取得しようとしてぐるぐる回っています。または、boost::bind 構文と C++ ラムダ構文を混同しているのかもしれません。あるいは、根本的に何かを誤解しているのかもしれません。

基本的に、THING* を受け取る関数 Z と、THING* を受け取る別の関数 X を構成し、独自のロジックを使用して、特定の THING* の文字列出力を生成します。

私にはバリエーションがあります - 2 つのデータ アクセサー タイプの関数を使用するものもあれば、bool + データ アクセサーを使用するものもあります。実際には問題ではありません - 結論は同じでなければなりません:

Z -> F(x, G(x)) で Z を構成するにはどうすればよいですか?

助けてくれてありがとう!

4

1 に答える 1

2

boost::bind(およびstd::bind)ネストされたバインド式を積極的に評価するため、署名と一致するものがありますstring MyDoc::PrintOne(THING*, double)。熱心な評価を防ぎ、ネストされたバインド式を直接返すには ( a の構築に適していstd::function<>ます)、次を使用しますboost::protect

boost::bind(
    &MyDoc::PrintOne,
    this,
    _1,
    boost::protect(boost::bind(&MyDoc::GetX, this, _1))
)

これについては、「関数合成にネストされたバインドを使用する」というタイトルのドキュメントのセクションで概説されています。

于 2012-05-21T14:53:21.493 に答える