Я пишу библиотеку 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
. Как мне это сделать?