문제

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_ );
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top