質問
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_ );
}