문제

다른 사람이 기능을 도와 줄 수 있는지 궁금합니다. 나는 unftors가 무엇인지, 그리고 그들이 어떻게 작동하는지 이해하지 못한다. 나는 그것을 인터넷 검색을 시도했지만 여전히 그것을 얻지 못한다. untctors는 어떻게 작동하고 템플릿에서 어떻게 작동합니까?

도움이 되었습니까?

해결책

functor는 기본적으로 "함수 객체"입니다. 클래스 나 구조물로 래핑 한 단일 함수이며 다른 기능으로 전달할 수 있습니다.

기능 통화 연산자 (OPERATOR ())에 과부하가 걸리는 자신의 클래스 또는 구조물을 만들어 작동합니다. 일반적으로, 당신은 단순히 그것을 untictor를 취하는 함수의 인수로서 내장으로 구성하여 인스턴스를 만듭니다.

다음이 있다고 가정합니다.

std::vector<int> counts;

이제 해당 벡터에 포함 된 모든 수를 증가 시키려고합니다. 수동으로 반복하여 획득하거나 untctor를 사용할 수 있습니다. 이 경우 적절한 기능자는 다음과 같습니다.

struct IncrementFunctor
{
    int operator() (int i)
    {
        return i + 1;
    }
}

Decrementfunctor는 이제 정수를 가져 와서 증가하는 untector입니다. 카운트에 적용하려면 std :: transform 함수를 사용할 수 있습니다.

std::transform(
    counts.begin(),       // the start of the input range
    counts.end(),         // the end of the input range
    counts.begin(),       // the place where transform should place new values. 
                          // in this case, we put it right back into the original list.
    IncrementFunctor());  // an instance of your functor

구문 ycrementfunctor ()는 해당 함수의 인스턴스를 생성 한 다음 std :: transform으로 직접 전달됩니다. 물론 인스턴스를 로컬 변수로 만들어 전달할 수 있지만 훨씬 더 편리합니다.

이제 템플릿으로. std :: transform의 functor 유형은 템플릿 인수입니다. 이것은 std :: transform이 당신의 functor가 어떤 유형인지 알지 못하기 때문입니다. 관심이있는 것은 피팅 연산자 ()가 정의되어 있으며

newValue = functor(oldValue);

컴파일러는 템플릿에 대해 똑똑하며 종종 템플릿 인수가 무엇인지 자체적으로 파악할 수 있습니다. 이 경우 컴파일러는 std :: transform에서 템플릿 유형으로 정의 된 유형 incrementfunctor의 매개 변수를 전달한다는 것을 자동으로 인식합니다. 목록에 대해서도 동일하므로 컴파일러는 실제 통화가 다음과 같습니다.

std::transform<std::vector<int>::iterator, // type of the input iterator
               std::vector<int>::iterator, // type of the output iterator
               IncrementFunctor>(          // type of your functor
    counts.begin(),       // the start of the input range
    counts.end(),         // the end of the input range
    counts.begin(),       // the place where transform should place new values. 
                          // in this case, we put it right back into the original list.
    IncrementFunctor());  // an instance of your functor

그것은 당신에게 약간의 타이핑을 절약합니다. ;)

다른 팁

untctor는 기능 통화 연산자, 추가로 구문 적으로 (), 괄호 안에는 선택적으로 인수 목록이 있습니다.

그것은 모두 템플릿 요구입니다. 템플릿에 관한 한, 이것을 호출하는 것은이 구문을 허용하는 모든 것입니다. 즉, 자유 함수 또는 재정의 클래스의 인스턴스입니다. operator()(). ( "무료"함수는 회원이 아닌 단지 하나 일뿐입니다.

템플릿 Metaprogramming 외에는 일반적으로 자유 함수가 AA functor라고 말하지 않으며, 재정의 클래스 인스턴스의 이름을 예약합니다. operator()():

struct Foo {
 public:
   void operator()( int i ) { // do something }
   void operator()( int i, char x ) { // do something else }
}

C ++ 템플릿에서 구문이 의미가 있습니다, 컴파일러는 행복하게 함수 또는 functor를 사용합니다.

template<typename T> class Bar {
  private int j ;
  public:
    Bar( int i ) : j(i) {}
    void doIt(T t) {
     t( j ) ;
  }
}

Foo f;
extern void resize( int i ) ; // in some header

Bar<Foo> bf( 5 ) ;
// a Bar that is templated on Foo
Bar< void (&)(int)   > br( 5 ) ; 
// a Bar that is templated on a function taking int and returning void

br.doit( &resize ) ; // call resize with br.j
bf.doit( f ) ; // call Foo::operator()(int) on Foo f with bf.j
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top