C ++ 2a - диапазон полиморф c - PullRequest
0 голосов
/ 13 февраля 2020

Я пишу библиотеку C ++, и у меня появилась эта удивительная идея использовать как можно больше C ++ 2a / C ++ 20. Таким образом, я использую стандартные концепции библиотеки и создаю свою собственную. Тем не менее, идея функции, возвращающей std::vector<X>, казалась мне не-C ++ 20 достаточной, поэтому я объявил в своей концепции соответствие типа возврата std::ranges::view<X>. Затем я реализовал некоторые классы, которые соответствуют этой концепции.

Однако проблема возникла, когда я захотел разработать класс-оболочку polymorphi c. Итак, предположим, что концепция C, и у меня есть три реализующих класса C1, C2 и C3 (но допустим больше). Теперь я хочу создать класс C_virtual и вытекающий из него шаблон C_virtual_impl<C c>, который позволит мне ссылаться на все классы, выполняющие C полиморфно. Однако, чтобы это работало, мне нужна оболочка polymorphi c std::ranges::view, похожая по духу на C_virtual.

. Я не встречал такого класса в заголовках и в справочнике C ++. Более того, когда я сам начал внедрять его, я быстро оказался неспособным к этому из-за некоторых требований к итераторам, в частности, по умолчанию конструктивности, перестановки и т. П.

Есть ли неочевидное решение в стандартной библиотеке или идиома? Если нет, как мне решить проблему? Возможно, смена дизайна будет работать. Я, конечно, не хочу возвращать std::vector<X> или возвращать V<X>, где V будет параметром типа C. Как мне это сделать?

1 Ответ

1 голос
/ 13 февраля 2020

Представления диапазона и многие другие методики шаблонов не предназначены для использования с полиморфизмом на основе наследования. Это очень похоже на то, как vector<BaseClass> не особенно полезен.

Если вам нужен полиморфизм времени выполнения, тогда вам нужен инструмент не наследования (напрямую); это тип стирания. То есть у вас есть некоторая оболочка вида, которая использует стирание типа для пересылки различных операций просмотра в стертый тип. Это также должно быть связано с итераторами со стертым типом, которые обертывают итераторы данного представления.

Теперь, конечно, это означает, что характеристики представления должны быть определены оберткой со стертым типом. Оболочка может реализовать концепцию input_range, но она никогда не сможет выполнить больше, чем input_range сама. Даже если вы добавите тип contiguous_range в оболочку, оболочка ограничит интерфейс интерфейсом input_range.

. Поэтому лучше всего избегать этого случая и полагаться на stati c полиморфизм через шаблоны всякий раз, когда это возможно.

...