Здравствуйте, Videoman, Вы писали:
V>И начаинается...
V>- преобразовать тип итераторов — я не могу
V>- перебразовать в указатели — я не могу, т.к. &*begin, &*end — нельзя разыменовывать если они указывают за конец данных (например у string_view) и т.д.
Ну да, получается не можешь. В общем случае итераторы разных типов взаимно не преобразуемы — так же, как и их контейнеры.
V>Вопрос:
V>Где как можно выйти в такой ситуации. Вроде задача элементарная, но времени отняла уже прилично. Так и чувствую себя как ослик бегущий за морковкой, ногу вытащишь, хвост увязнет и т.д.
Мне кажется, основная проблема в том, что ты пытаешься cделать обобщение в привязке к типу, тогда как здесь было бы уместнее делать обобщение в привязке к размеру, если я правильно понимаю задачу. Тогда версия для wchar_t просто отпала бы за недадобностью:
template<typename Iterator>
using underlying_size = std::integral_constant<size_t, sizeof(*std::declval<Iterator>())>;
template<typename It, std::enable_if_t<underlying_size<It>::value = 1, int> = 0>
constexpr uint_t CalcSomething(It beg, It end) // ...
template<typename It, std::enable_if_t<underlying_size<It>::value = 2, int> = 0>
constexpr uint_t CalcSomething(It beg, It end) // ...
template<typename It, std::enable_if_t<underlying_size<It>::value = 4, int> = 0>
constexpr uint_t CalcSomething(It beg, It end) // ...