Будет ли предстоящее добавление модулей в С++ исправит/уменьшит потребность в идиоме pimpl?

Идиома pimpl, насколько я могу судить, скрывает частную реализацию за заранее объявленным именем символа, чтобы его можно было объявить и использовать в частном модуле cpp.

Пример: https://cpppatterns.com/patterns/pimpl.html

Насколько я могу судить, поскольку класс не использует pimpl, он должен знать о своей структуре (размер, выравнивание), pimpl должен быть косвенным через какой-то указатель.

(или выделяется как блок достаточного размера, а затем перемещается/создается в место, где он позже интерпретируется приведением.)

Будущая спецификация модулей как-то решает эту проблему?


person JeffV    schedule 09.02.2018    source источник
comment
Я еще недостаточно прочитал о модулях, но одно могу сказать точно: pImpl не исчезнет из библиотек, нацеленных на обратно совместимый ABI. Я предполагаю, что это делает проблему независимой от языка, то есть выходит за рамки любых предлагаемых функций С++.   -  person The Vee    schedule 09.02.2018


Ответы (1)


P0142R0

5.2.3 Экспортированные свойства класса

Иногда досадным правилом стандартного C++ является правило управления доступом, а не видимостью. Например. частный член класса виден, но недоступен для сущностей, не являющихся членами. В частности, любое изменение частного члена класса, вероятно, вызовет электронную обработку любой единицы перевода, которая зависит от определения этого класса, даже если изменение не влияет на достоверность зависимых единиц. Заманчиво решить эту проблему с помощью модульной системы. Однако наличие двух различных наборов правил (видимость и доступность) для членов класса кажется нам нежелательным и потенциально плодотворным источником путаницы. Кроме того, мы хотим поддерживать массовую миграцию существующих кодов в модули, чтобы программистам не приходилось беспокоиться о правилах поиска имен членов класса: если вы понимаете эти правила сегодня, вам не нужно изучать новые правила при переходе к модулям, и вы не нужно беспокоиться о том, как предоставляются классы, которые вы потребляете (через модули или не модули).

Правило 3 Как правило, любое свойство класса (например, полнота), которое вычисляется в части объявления экспорта модуля, становится доступным для импорта модулей как есть.

Поскольку все свойства класса видны импортеру, любое изменение этих свойств будет видно в импортере. Я не вижу модулей, решающих проблему, которую решает PIMPL.

person eerorika    schedule 09.02.2018