문제

C ++ 템플릿을 사용하여 전략 기능을 전달하여 기능의 동작을 변경합니다. 잘 작동합니다. 내가 전달한 functor는 스토리지가없는 무국적 클래스이며 () 연산자에게 클래식 함수 방식으로 과부하됩니다.

template <typename Operation> int foo(int a) 
{
int b=Operation()(a);
/* use b here, etc */
}

나는 이것을 자주하고, 잘 작동하며, 종종 6 ~ 7 개의 템플릿 unftors가 통과 한 템플릿을 만들고 있습니다!

그러나 코드 우아함과 효율성에 대해 걱정합니다. functor는 stanteless이므로 Operation () 생성자가 자유 롭고 functor의 평가는 상감 기능만큼 효율적이라고 가정하지만 모든 C ++ 프로그래머와 마찬가지로 항상 잔소리가 있습니다.

두 번째 질문은 대체 functor 접근법을 사용할 수 있는지 여부입니다. 같은 것 :

struct Operation {
  Operation(int a, int &b) { b=a*a; }
};
template <typename Operation> int foo(int a) 
 {
   int b;
   Operation(a,b);
    /* use b here, etc */
 }

나는 누군가가 untictor의 "작업"으로 생성자를 사용하는 것을 본 적이 없지만 작동 해야하는 것 같습니다. 이점이 있습니까? 어떤 단점이 있습니까? 나는 이상한 두 배의 괄호 "Operator () (a)"를 제거하는 것을 좋아하지만 그것은 단지 미학 일 것입니다.

도움이 되었습니까?

해결책

어떤 단점이 있습니까?

  • CTORS는 유용한 값을 반환하지 않습니다. 체인 콜에 사용할 수 없습니다 (예 : foo (bar ()).
  • 그들은 던질 수 있습니다.
  • 디자인 관점 - CTORS는 객체 생성 기능이며 실제로는 작업자가 아닙니다.

다른 팁

  1. 컴파일러는 실제로 빈 작동 생성자를 인라인으로 인라인 (최적화를 끄는 경우를 제외하고 비슷한 상황에서 최소한 GCC).
  2. 생성자에서 모든 것을 수행 할 때의 단점은 이런 식으로 내부 상태를 가진 untctor를 만들 수 없다는 것입니다. 술어를 만족시키는 요소의 수를 계산하기위한 함수. 또한 실제 객체의 메소드를 functor로 사용하면 나중에 실행을 위해 IT 인스턴스를 저장할 수 있습니다. 생성자 접근 방식으로 수행 할 수 없습니다.

성능 POV에서 VC와 GCC로 완전히 최적화 된 코드는 시연됩니다. 그러나 더 나은 전략은 종종 functor를 매개 변수로 취하는 것입니다.이면 훨씬 더 유연성과 동일한 성능 특성을 얻습니다.

STL-Containers와 함께 작동하는 functor를 정의하는 것이 좋습니다. 즉, Operator ()를 구현해야합니다. (당신이 사용하는 언어의 API를 따르는 것은 항상 좋은 생각입니다.)

이는 알고리즘이 매우 일반적이 될 수있게합니다 (함수, 기능, stl-bind, boost :: function, boost :: bind, boost :: lambda, ...).

이런 식으로 functor 유형을 템플릿 매개 변수로 지정할 필요가 없으며 인스턴스를 구성하고 다음과 같이 전달하십시오.

my_algorithm(foo, bar, MyOperation())

다른 클래스에서 생성자를 구현하는 데 어떤 점이 없는지 보이지 않습니다.
당신이하는 일은 캡슐화를 깨고 학대를 위해 수업을 설정하는 것입니다.

생성자는 클래스에 의해 정의 된대로 객체를 좋은 상태로 초기화해야합니다. 다른 개체가 수업을 초기화 할 수 있도록 허용합니다. 이 템플릿 클래스가 클래스를 올바르게 초기화하는 방법을 알고 있다는 보장은 무엇입니까? 수업 사용자는 의도하지 않은 방식으로 객체의 내부 상태를 엉망으로 만들 수있는 객체를 제공 할 수 있습니다.

수업은 자체적으로 포함되어야하며 좋은 상태로 초기화해야합니다. 당신이하고있는 것처럼 보이는 것은 그들이 할 수있는 일을보기 위해 템플릿을 가지고 노는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top