제 경험상 실제로는 좋은 디자인 패턴 템플릿 라이브러리가 없습니다. 디자인 패턴은 경고없이 구체적인 템플릿으로 올바르게 캡쳐하거나 클래스 자체에 플러그를 꽂는 클래스에 제한을 적용하기가 어렵습니다.
Singleton
예를 들어 보겠습니다. 글쎄, 난 사실 내가하지 않도록 그것을 사용하는 부스트을 가지고 그것을 다시거야 :
template <typename T>
class Singleton {
Singleton (const Singleton<T> &) = delete;
Singleton & operator = (const Singleton<T> &) = delete;
static Singleton<T> & GetInstanceInternal() {
static T instance;
return instance;
}
protected:
Singleton() {}
~Singleton() {}
public:
static T & GetInstance() {
return static_cast<T &>(GetInstanceInternal());
}
};
을이 Singleton<T>
싱글 수 있지만, 정말로 원하는 것은 T
싱글을 만드는 것입니다. 사용량이 (Singleton::GetInstanceInternal()
에 의해 강제로) T
이 Singleton<T>
에서 상속해야하기 때문에 글쎄, 당신은,이 문제가되지 않습니다, 말할 수 있습니다
이
class Foo : public Singleton<Foo> {
public:
void foo() { /*...*/ }
};
본래의 프로그래머가! "작업 완료"생각, 이후 Foo
상속 때문에 Singleton<Foo>
에서 Foo
이 싱글 톤이됩니다.
Foo x;
이 생성자는 개인 (따라서, Singleton<Foo>
필요가 친구를 만들 수)해야한다이 문제를 해결하려면 : 그것은이를 방지하지 않기 때문에하지만,하지 않습니다. 소멸자를 직접 호출하지 못하게하려면 비공개로 만들어야합니다.
class Foo : public Singleton<Foo> {
friend class Singleton<Foo>;
Foo() {}
~Foo() {}
public:
void foo() { /*...*/ }
};
그래서, Singleton<Foo>
을 상속 이외에 제대로 적용 할 수 없습니다 만 상속 추가 요구 사항이 있습니다. 이러한 모든 요구 사항을 문서화 할 수는 있지만 템플릿 사용이 덜 유용 해지고 직접 기능을 Foo
에 넣는 것만 큼 많은 작업이 필요하다고 주장 할 수 있습니다.
출처
2013-08-28 20:52:49
jxh
나는 부스트를 기반으로 한 C++ 싱글 톤 구현을 매우 우아하게 부르지는 않을 것이다 ... –
어, GoF 책을 읽나요? 이 책의 예제는 대부분 C++입니다. – PherricOxide
@Andreas Grapentin Qt 사람들은 부스트 라이브러리를 선호하지 않습니다. 여기 예를 들었습니다. –