3

mainの外でfoo_を渡す方法はありますか?ファンクターに関する別の質問で、ブーストについて何かを見ました。それはうまくいくようです。これがその質問でブーストに言及している答えですできれば、ブーストは避けたいです。

#include <iostream>

int main()
{
    class foo {
        public:
        void operator()() {
            std::cout << "Hello" << std::endl;
        }
    };

    foo foo_;
    foo_();
    return 0;
}
4

5 に答える 5

4

いいえ、現在、ローカルタイプをテンプレートに入れることは許可されていません(そうでない場合は、boostまたはstd :: tr1 :: functionを使用できます)。ただし、Fooが何かを継承し(fooが実装する仮想opeator()関数を持つ)、代わりにptrをFooに渡す場合は、OOPを実行できます。

于 2009-10-25T08:39:38.997 に答える
1

ローカル クラスの静的関数のアドレスを使用できるようです。ただし、 operator() は非静的メンバー関数でなければならないため、名前を付ける必要があります。

#include <iostream>

template <class T>
void bar(T f)
{
    f();
}

int main()
{
    class foo {
        public:
        static void do_it() {
            std::cout << "Hello" << std::endl;
        }
    };
    bar(&foo::do_it);
    return 0;
}
于 2009-10-25T12:23:56.053 に答える
0

現在のスコープで定義されていないクラスのメンバーを呼び出すことはできないと思います。この場合のファンクターは状態を保持せず、パラメーターを受け取らず、値を返さない関数のように動作するため、そのインスタンスを生の関数ポインターに割り当てることができます。ただし、これはfooではなくなります。単なる関数ポインタです。

1つの解決策は、次のようなグローバルスコープで定義された純粋な仮想基本クラスからfooを派生させることです。

class base
{
public:
    void operator()() { doit(); }
protected:
    virtual void doit() = 0;
};

int main()
{
    class foo
    {
    public:
        void operator()() { doit(); }
    protected:
        virtual void doit()
        {
            std::cout << "Hello" << std::endl;
        }
    };
 }

これで、 fooのインスタンスをbaseとして渡すことができ、仮想doit()メソッドが期待どおりに呼び出されます。

于 2009-10-25T08:39:48.263 に答える
0

編集: これは有効な C++ ではないようです。

ファンクターをテンプレートパラメーターとして受け入れるものがある場合、ファンクターとして動作するものを渡すことができますが、それがあなたの求めているものかどうかは完全にはわかりませんか?

template< class tFunctor >
void UseFunctor( const tFunctor& func )
{
  func();
}

int main()
{
  foo foo_;
  UseFunctor( foo_ );
}
于 2009-10-25T08:33:10.880 に答える