pimpl 관용구의 주된 이점은 헤더 대신 구현 파일에서 데이터 멤버를 숨기는 것입니다. 그러나 컴파일러가 요구에 따라 템플릿을 인스턴스화하려면 템플릿을 헤더에 완전히 정의해야합니다. 이 경우 템플리트 클래스에 pimpl 관용구를 사용하면 어떤 이점이 있습니까?템플리트 화 된 클래스가있는 pimpl 관용법에 이점이 있습니까?
답변
템플릿 기반 클래스에서 사용할 때 pimpl 이디엄은 실제로 아무것도 숨기지 않지만 C++ 11 이동 의미론을 사용하면 덜 우려 할 만하지만 비 던져 스왑을 쉽게 작성할 수 있습니다.
대규모 프로젝트의 경우 번역 단위를 단독으로 분리하면 여드름이 생길 수 있습니다. 엄격하게 pimpl 관용구하지 않을 수 있습니다
// main interface
template <typename> struct MyImpl;
class TheInterface
{
MyImpl<int> * pimpl;
};
// implementation
#include "MyImpl.hpp" // heavy-weight template library
// TheInterface implementation
'TheInterface'가 템플릿 인 경우에는 작동하지 않습니다. 맞습니까? –
기본 템플릿의 구현을 클래스 정의에서 분리하고 해당 TU에서 명시 적 인스턴스화를 사용할 수는 있지만 멋지지는 않습니다. 그래도 작은 수의 고정 된 템플릿 매개 변수가있는 경우에만 의미가 있습니다. 그러나 그렇지 않다면 어쨌든 전체 발목 아이디어가 적절하지 않을 수 있습니다. –
큰 프로젝트에서 pimpl 관용구는 프로젝트를 더 크게 만드는 좋은 방법입니다. 결과는 C++로 코딩 된 일종의 C# 프로그램이며,이 경우에는 pimling 대신 C#으로 직접 포팅하는 것이 더 낫습니다. 미리 컴파일 된 헤더가 이미 처리 된 경우에는 pimpl 관용구의 컴파일 속도가 향상되지 않습니다. ** pimpl은 C++ ** –
Theres는 1 예,하지만에 대해 알고 보장 할만큼 유사하다 :이 템플릿으로도 사용할 수 있습니다. 그것은 타입 안전하지 않은 버전 위에 타입 안전 템플릿 래퍼를 갖는 것입니다.
class MapBase
{
public:
void* getForKey(const std::string & k);
void setForKey(const std::string & k, void * v);
...
};
template<typename T>
class MyMap
{
public:
T* getForKey(const std::string &k) { return (T*)base_.getForKey(k); }
void setForKey(const std::string &k, const T* v) { base_.setForKey(k, T*v); }
private:
MapBase base_;
};
지금 MyMap<T>
의 사용은 MapBase의 내부에 노출 될 필요가 없습니다, 당신은 단지 그 기능의 내장 중 하나 구현을 얻는다. 또한 MapBase를 디커플링을 더욱 강력하게 만드는 추상 기본 클래스로 만드는 것도 고려해 볼 수 있습니다.
내가 말했듯이, 정확하게는 여드름이 아니지만 같은 방식으로 같은 문제가 해결 될 수 있습니다.
관용구를 약간 확장하면 어떤 경우에는 약간 벗어날 수 있다고 생각합니다. 템플릿에서 모든 작업이 반드시 템플릿 매개 변수에 의존해야하는 것은 아닙니다. 그래서 당신은 자신이 같은 pimpl 관용구, 뭔가를 사용하는 Impl
클래스에서 상속 할 수 있습니다 : 물론
struct FooPimpl;
class FooImpl {
protected:
FooPimpl* pimpl;
public:
void myCommonInterfaceMethod();
};
template <typename T> class Foo : public FooImpl {
// stuff that depends on T
};
,이 상황에 크게 의존한다. 하지만 템플릿 클래스 컨텍스트에서 작업하는 pimpl 관용구를 참조하십시오.
여전히 유용합니다. 자동 또는 공유 포인터를 고려해보십시오.이 포인터는 템플릿이며 PIMPL을 해결하고 구현하는 데 매우 유용합니다. 그것이 최선의 해결책인지 여부는 문제에 달려 있습니다.
컴파일러가 필요에 따라 인스턴스화하기 위해 템플릿에 헤더를 완전히 정의해야합니다.
템플릿의 구성원 및 인터페이스를 선언 한 다음 유형의 cpp 파일에서 전문화에 대한 필수 정의를 #include
수 있으며 거기에서 사용할 수 있습니다.
- 1. pimpl
- 2. 템플리트 함수가 템플리트 인수를 취함
- 3. 템플리트 함수 친구를 템플리트 특수화 클래스로 만들 수 있습니까?
- 4. 업데이트 된 sitemap.xml을 사용하면 어떤 이점이 있습니까?
- 5. 최소한의 코드로 pImpl 구현
- 6. Implicits, pimpl 패턴 등
- 7. 사용자 정의 된 사용자 페이지 템플리트 이름
- 8. Loki의 Pimpl 구현 방법은 무엇입니까?
- 9. Drupal 모듈 전용 템플리트
- 10. NHibernate와 비정규 화 된 테이블
- 11. "PIMPL"관용구를 사용해야하는 이유는 무엇입니까?
- 12. 포괄적 인 인터페이스에서 이점이 있습니까?
- 13. SimpleDB를 비정규 화 된 데이터베이스로
- 14. 모델에서의 단위 화 된 상수
- 15. WSPBuilder 난독 화 된 DLL
- 16. 이것은 비정규 화 된 테이블입니까?
- 17. 세그먼트 화 된 UITable의 불안정
- 18. Node.js 용 액체 템플리트
- 19. Qt Creator의 파일 템플리트
- 20. 상속 된 기본 클래스가있는 LINQ 일반 쿼리?
- 21. MSBuild를 사용하면 어떤 이점이 있습니까?
- 22. sessionStorage를 사용하면 어떤 이점이 있습니까?
- 23. 여기에 멀티 코어 이점이 있습니까?
- 24. WCF를 사용하면 어떤 이점이 있습니까?
- 25. JNI에서 메모리와 속도면에서 이점이 있습니까?
- 26. Subversion을 사용하면 어떤 이점이 있습니까?
- 27. 카운트 된 클래스가있는 Word의 인스턴스 랩
- 28. 이름이 테스트 된 클래스가있는 경우 요소 표시
- 29. 분해 된 디렉토리 대신 war 파일을 배포하면 어떤 이점이 있습니까?
- 30. MySQL에서 소프트 삭제 된 행을 삭제하면 어떤 이점이 있습니까?
+1 완전히 잊어 버렸습니다. 던지지 않는 청결 함 외에도 스왑의 효율성 이점이기도합니다. 이것은 불투명 한 클래스가 pimpled 클래스처럼 쉽게 움직일 수 없기 때문에 이동 의미에 대해서도 적용됩니다. –
이것이 유일한 실질적인 이점 인 것 같습니다. –