자동화 pimpl'ing 의 C++클래스가 있는 쉬운 방법은?
-
06-07-2019 - |
문제
Pimpl 의 근원의 보일러에 많은 C++코드입니다.그와 같은 종류의 것 조합의 매크로,템플릿 및 아마 약간의 외부 도구의 도움을 해결할 수 있지만,나는 무엇인지 가장 쉬운 방법이 될 것이다. 본 템플릿 는 도움말의 일부를 드는지 많은-당신은 여전히 필요 결국 쓰 전달 기능에 대한 모든 방법의 클래스하려는 랩이 포함되어 있습니다.이 있는 쉬운 방법이 있을까?
내가 상상하는 데 사용되는 도구의 한 부분으로 만드는 과정이다.당신이 당신의 대중에 헤더를 수 pimpl 클래스고,그래서 당신이 제공하는 일부 입력 파일,말 pimpl.에서,나열하는 클래스(을 구현 un-pimpl 것)당신이보고 싶은 포장면,그 파일에 검사를 하는 pimpl 클래스를 생성하고 그들의 헤더(원본 클래스의 헤더)은 설치하는 동안'만을 설치'.문제 보이지 않는데 방법이 없이 만발한 C++파서도 컴파일러 공급업체할 수 없습니다.어쩌면 클래스를 작성할 수 있습니에 어떻게든지는 작업의 외부 도구지만,나는 나가지 못 모든 종류의 모퉁이의 경우(예:템플릿 클래스고/또는 템플릿 구성원 기능).
어떤 아이디어가?다른 사람이 올 솔루션으로 이 문제에 대한 이미?
해결책
없음 없는 쉽게 대답합니다.:-(나는 생각으로는 거의 모든 OO 전문가 말하는"아보세요성에 상속을 통해"가 될 것입니다 언어로 지원한 소재는 많은 보다 쉽게 상속입니다.
다른 팁
내가 이것을 말하고 있지 않다는 것은 좋은(뭔가 달려들 마음).
하지만 당신은 실험으로 과부하자->
#include <memory>
#include <iostream>
class X
{
public:
void plop()
{
std::cout << "Plop\n";
}
};
class PimplX
{
public:
PimplX()
{
pimpl.reset(new X);
}
X* operator->()
{
return pimpl.get();
}
private:
PimplX(PimplX const&);
PimplX& operator=(PimplX const&);
std::auto_ptr<X> pimpl;
};
int main()
{
PimplX x;
x->plop();
}
하나의 옵션을 사용하여 인터페이스 클래스는 대신:
class ClassA {
virtual void foo() = 0;
static ClassA *create();
};
// in ClassA.cpp
class ImplA : public ClassA {
/* ... */
};
ClassA *ClassA::create() {
return new ImplA();
}
이것은 그러나 추가의 오버헤드에서 가져 vtable 함수 포인터입니다.
다른 것보다,나는 생각할 수 없다 이러한 도구입니다.당신이 말했듯이,구문 분석하는 C++이 아닌 사소한,및 다른 언어 밖에 있는 그것의 더 적은 문제가(예를 들어,C#또는 Java 늦은 bind 모든 것,그래서 당신은 변경할 수 있습니다 자신의 메모리 레이아웃을 나중에 문제없이).