함수자 클래스는 값으로 전달되도록 설계하자

STL의 함수 객체는 일반적으로 값으로 전달(복사) 된다. 하지만





for_each<vector<Object>::iterator, DoSomething&>(vi.begin(), vi.end(), d);

와 같이 참조를 명시적으로 선언하는 것도 불가능 한것은 아니다. 문제는 제품에 따라서 이런 코드가 컴파일이 되지 않을 수도 있다는 것이다.
함수 객체를 값으로 전달하는 방식 때문에 다형성을 구현하기 어려워 지는 단점이 있지만 이것은 프록시 클래스로 극복이 가능하다.

// 실제 구현부 함수
template<typename T>
class BPFCImpl{
private:
Widget w;
int x;

virtual ~BPFCImpl();
// 다형성으로 구현된 함수
virtual void operator()(const T& val) const;
// 프록시 클래스가 접근가능하게 한다.
friend class BPFC<T>
};

// 프록시 클래스
template<typename T>
class BPFC: public unary_function<T, void>
{
private:
BPFCImpl<T> *pImpl;

public:
void operator()(const T& val) const
{
// 실제 구현객체를 호출한다.
pImpl->operator()(val);
}
};

크기가 작고 단형성을 유지하면서 많은 데이터의 접근이 가능하며 다형성을 구현할수 있는 방식이다. 위의 방식은 GOF에서 브릿지패턴(BridgePattern)으로 불리고 있다.

위의 내용은 상당히 간략히 구현된 내용이다. 추가적으로 BPFCImpl에 참조카운팅에 관련된 내용과 BPFC의 복사 생성자에 관한 구현 내용을 좀더 고민해 봐야 한다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다