0

次のコードがあるとします。

int f(int, int);

int main()
{
    SomeFunc(boost::bind(f, 1, 2));
}

SomeFunc() 関数から、バインドされた型が保持する引数にアクセスできますか? このようなもの(疑似コード):

// Obvious syntax issues...
void SomeFunc(boost::bind& functor)
{
    if(functor.function == &f)
    {
        if(functor.argument1 == 1)
            DoSomething();
    }
}

この情報を boost::bind タイプから引き出すことはできますか?

4

3 に答える 3

5

boost::bind はテンプレート化された関数であり、型ではありません。その関数によって返される実際の型は、特定されていない型のある種のファンクターです。実際のところ、boost::bind 関数への引数が何であるかに応じて、多くの異なる未指定の型を返す可能性があります。

型は指定されておらず、ライブラリは CopyConstructible であるとのみ述べているため、適切な数と型の引数 (プレースホルダーごとに 1 つ、バインドされたメソッド/関数から推定される型) を持つ operator() を実装し、内部型result_typeを提供します。これは、その operator() の戻り値の型と同じです。

これらの指定されていないクラスのインターフェースは、まあ、指定されていません。引数へのアクセサーはおそらく提供されません。たとえ提供されていても、ライブラリの内部を研究して内部知識を得ると、ライブラリのアップグレードでコードが壊れるリスクがあります (実装者は自由に型を変更して変更できます)。公式に文書化されていないすべてのインターフェース)。

ライブラリ全体は、引数が何であるかを実際には気にしないという事実に基づいて構築されています。または、引数が定義されていたり、プレースホルダーのみが使用されている場合でも、結果のオブジェクトが特定のインターフェイスで呼び出されることだけが重要です。

いいえ、できません。

于 2009-09-08T20:08:23.327 に答える
2

本当の問題は、なぜそれをしたいのかということです。
あなたにはできないと思いますが、あなたがしようとしているという事実は少し心配です.

于 2009-09-08T19:49:42.523 に答える
0

いいえ、 ではできませんboost::bind

boost::bindすべての詳細が隠されている一種のファンクター オブジェクトを生成するだけです。構築するよりもboost::function、またはboost::signalそれを使用して、実行できる唯一のことです。boost::functionオブジェクトを比較することさえできません。

とにかく、あなたが解決している問題は明らかではありません。そのようなアプローチは私には厄介に見えます。本当にそれが必要ですか?

于 2009-09-08T19:50:46.577 に答える