d-указатели являются одной из многих реализаций шаблона pimpl.Это также одна из ранних реализаций: « Название« d-pointer »происходит от Арнта Гулбрандсена из Trolltech, который впервые представил эту технику в Qt, сделав ее одной из первых библиотек C ++ с графическим интерфейсом, поддерживающей двоичную совместимость даже между большимиrelease." Source
Одним из преимуществ использования макросов является возможность изменения некоторых деталей реализации шаблона в центральном месте во время компиляции.Например, вы могли бы спроектировать свои макросы, чтобы оставить возможность позже перейти к реализации fast pimpl без изменения тонны кода (надеюсь, вам это не понадобится, если вы используете pimpl :-)).При условии, что вы не допустили ошибок в дизайне / реализации макроса ...
Однако я лично рекомендовал бы избегать макросов для вашей реализации pimpl, поскольку они загадочны для любого новичка в вашем исходном дереве.Макросы создают магические диалекты, которые часто подвержены ошибкам и не так значимы, как исходный код.Они также поставляются со всеми проблемами, связанными с процессором C Pre;он не знает базового языка.
Лично мне нравится использовать то, что я называю d-ссылкой.Вместо указателя вы используете ссылку, и вам не нужно использовать d-ссылку.8-) Это выглядит примерно так:
// MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
// implementation methods
private:
class MyClassPrivate& d;
};
// MyClass.cpp
struct MyClassPrivate
{
int x;
};
MyClass::MyClass()
: d(*new MyClassPrivate)
{
}
MyClass::~MyClass()
{
delete &d;
}
// In methods use d.x