Я думаю, что люди путают идиому Pimpl с Адаптером / Мостом / Стратегией паттернами . Идиомы специфичны для языка. Шаблоны могут применяться ко многим языкам.
Идиома Pimpl была разработана для решения следующей проблемы в C ++: закрытые члены класса видны в объявлении класса, что добавляет ненужные зависимости #include для пользователя класса. Эта идиома также известна как межсетевой экран компилятора .
Если реализация написана непосредственно в соответствующем файле * .cpp внешнего класса и недоступна за пределами модуля, то Я думаю, что это прекрасно, просто использовать структуру для класса Pimpl . Для дальнейшего закрепления идеи о том, что реализации не предназначены для повторного использования напрямую, я определил их как частную внутреннюю структуру:
// foo.h
class Foo : boost::noncopyable
{
public:
...
private:
struct Impl;
boost::scoped_ptr<Impl> impl_;
};
// foo.cpp
struct Foo::Impl
{
// Impl method and member definitions
};
// Foo method definitions
Как только появится заголовочный файл для класса реализации, я думаю, что мы больше не говорим об идиоме Pimpl. Мы скорее говорим об адаптере, мосте, стратегии, интерфейсных классах и т.д ...
Только мои 2 цента.