4

これは、投稿「C++ の隠し機能」で読んだサロゲート コール関数に似たソース コードです。

私を混乱させる唯一の部分は、それらの演算子のオーバーロードされた関数です。彼らはどのようなオペレーターですか?(それらは確かに通常の operator() のようには見えません。戻り値の型が指定されていないのに、なぜ関数ポインターを返すのでしょうか?

ありがとう!

template <typename Fcn1, typename Fcn2>
class Surrogate {
public:
    Surrogate(Fcn1 *f1, Fcn2 *f2) : f1_(f1), f2_(f2) {}

    // Overloaded operators.
    // But what does this do? What kind of operators are they?
    operator Fcn1*() { return f1_; }
    operator Fcn2*() { return f2_; }

private:
    Fcn1 *f1_;
    Fcn2 *f2_;
};

void foo (int i)
{
    std::cout << "foo: " << i << std::endl;
}

void bar (double i)
{
    std::cout << "bar: " << i << std::endl;
}

int main ()
{
    Surrogate<void(int), void(double)> callable(foo, bar);

    callable(10);       // calls foo
    callable(10.1);     // calls bar

    return 0;
}
4

3 に答える 3

1

これらは単なるユーザー定義の変換演算子です。ユーザー定義の変換演算子は C++ 言語の基本的な機能です。つまり、それらについては C++ の本やチュートリアルで読むことができます。

言語仕様のセクション 12.3.2 で構文が説明されていますが、コンパイラによる構文の使用法を管理する規則はドキュメント全体に散らばっており、比較的広範です。つまり、SO投稿で説明できる、または説明する必要があるものではありません。

本を見つけます。本の内容がよくわからない場合は、ここに戻ってください。

于 2012-07-06T01:42:33.183 に答える
1

callable(10);実際の呼び出しは*(callable.operator void(*)(int))(10);.

コンパイラはcallable、 が関数呼び出し式で使用されていることを認識しました。ここで、関数呼び出し式の場合、コンパイラーは関数、関数ポインター、またはoperator()- を持つオブジェクトを必要とします。

この場合、callableこれらのどれもありません。ただし、これらのいずれかに、つまり関数ポインターに変換callableできます。call 式、特に引数が与えられると、オーバーロードの解決によって が選択されます。intvoid(*)(int)

于 2012-07-06T13:33:09.947 に答える