문제
Main 외부에서 foo_를 통과하는 방법이 있습니까? Functors에 관한 또 다른 질문에서 Boost에 대해 무언가를 보았습니다. 작동하는 것처럼 보입니다. 여기에 있습니다 대답 그 질문에서 부스트를 언급합니다. 가능하다면 부스트를 피하고 싶습니다.
#include <iostream>
int main()
{
class foo {
public:
void operator()() {
std::cout << "Hello" << std::endl;
}
};
foo foo_;
foo_();
return 0;
}
해결책
아니요, 현재 로컬 유형은 템플릿으로 들어갈 수 없습니다 (그렇지 않으면 부스트 또는 std :: tr1 :: 함수를 사용할 수 있습니다). 그러나 foo가 무언가를 물려받는 곳 (가상 opeator () 기능이있는 곳 (foo implemen ts)을 상속 받고 대신 PTR을 전달할 수 있습니다.
다른 팁
기능이 의미하는 경우 로컬 클래스는 템플릿 인수로 사용할 수 없습니다. 이것은 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;
}
나는 현재 범위에 정의되지 않은 클래스의 멤버를 호출하는 것이 불가능하다고 생각하지 않습니다. 이 경우 functor는 상태를 유지하지 않고 매개 변수를 사용하지 않고 값을 반환하지 않는 함수처럼 동작하므로 인스턴스를 원시 기능 포인터에 할당 할 수 있습니다. 그러나 더 이상 a foo: 단지 함수 포인터 일뿐입니다.
한 가지 해결책은 도출하는 것입니다 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 주위에 베이스, 및 Virtual doit () 메소드는 예상대로 호출됩니다.
편집 : 일부 부실러는 불만없이 가져 가지만 유효한 C ++ 인 것처럼 보이지 않습니다.
템플릿 매개 변수로 functor를 받아들이는 것이 있다면, 당신은 그것이 당신이 추구하는 것을 완전히 확신하지는 않지만 functor로 작동하는 것에 전달할 수 있습니까?
template< class tFunctor >
void UseFunctor( const tFunctor& func )
{
func();
}
int main()
{
foo foo_;
UseFunctor( foo_ );
}