質問

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

#include <iostream>

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

    foo foo_;
    foo_();
    return 0;
}
役に立ちましたか?

解決

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

他のヒント

関数のローカルクラスは、それがあなたが意味するものである場合、テンプレート引数として使用できません。これはC ++ 0xでのみサポートされます。

ローカルクラスの静的関数のアドレスを使用できる可能性があります。ただし、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;
}

現在のスコープで定義されていないクラスのメンバーを呼び出すことはできないと思います。この場合のファンクターは状態を保持せず、パラメーターを受け取らず値を返さない関数のように動作するため、そのインスタンスを生の関数ポインターに割り当てることができます。ただし、それはもはや 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()メソッドが期待どおりに呼び出されます。

編集:一部のコパイラーは文句なしにそれを受け入れますが、これは有効なC ++ではないようです。

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

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

int main()
{
  foo foo_;
  UseFunctor( foo_ );
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top