Тут ругается на несоответствие типа. В конкретном случае у меня out это char итератор, а справа std::uint8_t.
Я хотел скастить через OutputIterator::value_type, но у back_insert_iterator это void.
Здравствуйте, sergii.p, Вы писали:
П>>И что теперь делать?
SP>надо минимальный пример. У меня работает https://godbolt.org/z/Y549n7Ta4 SP>Как *iter++, так и *++iter
Сорян, не указал, у меня MSVC.
Попробовал перенастроить твой пример под MSVC, но что-то не срослось — https://godbolt.org/z/vh1v7oh3Y
Причем какая-то проблема с cmake
SP>наверное это более правильно, потому как библиотечный код не должен делать неявные преобразования.
Можно, но у меня нет лямбды, есть функция, которая получает два итератора на байты, и OutputIterator. Этот OutputIterator я создаю для std::string, но ничто не должно мне помешать сделать тоже самое для вектора из uint8_t. Поэтому я хотел скастить к OutputIterator::value_type, но у back_insert_iterator это всегда void. Сейчас ковыряюсь через iterator_traits, но там тоже какое-то г полезло
Здравствуйте, пффф, Вы писали:
П>Можно, но у меня нет лямбды, есть функция, которая получает два итератора на байты, и OutputIterator. Этот OutputIterator я создаю для std::string, но ничто не должно мне помешать сделать тоже самое для вектора из uint8_t. Поэтому я хотел скастить к OutputIterator::value_type, но у back_insert_iterator это всегда void. Сейчас ковыряюсь через iterator_traits, но там тоже какое-то г полезло
П>UPD Переделал пример, как это у меня с шаблоном, и как я пытаюсь с кастом к value_type — https://gcc.godbolt.org/z/5n89nv6jY
Здравствуйте, so5team, Вы писали:
S>Мало что понял из вашего описания, но вроде бы вам нужно что-то типа: https://gcc.godbolt.org/z/35PfPj7hh
Похоже, что да. Я только не понял, а почему с iterator_traits не работает? back_insert_iterator — не настоящий итератор, и для него нет специализации iterator_traits?
Я полагал, что для него есть всё то, что ты написал
Здравствуйте, пффф, Вы писали:
П>Можно, но у меня нет лямбды, есть функция, которая получает два итератора на байты, и OutputIterator. Этот OutputIterator я создаю для std::string, но ничто не должно мне помешать сделать тоже самое для вектора из uint8_t. Поэтому я хотел скастить к OutputIterator::value_type, но у back_insert_iterator это всегда void. Сейчас ковыряюсь через iterator_traits, но там тоже какое-то г полезло
П>UPD Переделал пример, как это у меня с шаблоном, и как я пытаюсь с кастом к value_type — https://gcc.godbolt.org/z/5n89nv6jY
Получить value_type можно через container_type итератора.
using IterType = OutputIterator;
using IterCharType = typename IterType :: container_type :: value_type;
for(size_t i = 0; i < num; ++i, ++iter)
{
*iter = static_cast<IterCharType>( func() );
}
П>Тут ругается на несоответствие типа. В конкретном случае у меня out это char итератор, а справа std::uint8_t. П>Я хотел скастить через OutputIterator::value_type, но у back_insert_iterator это void.
П>И что теперь делать?
Заглянув в описание std::void_t<> https://en.cppreference.com/w/cpp/types/void_t
я нашёл универсальное решение (аналог SFINAE) для случаев когда у итератора есть вложенный container_type, и когда его нет.
Здравствуйте, Sm0ke, Вы писали:
S>Вы это пробовали? S>back_insert_iterator : оператор * возвращает *this S>у него Перегружен оператор = S>Это работать не будет.
Ясно. Нет, не пробовал. Как-то выпустил я из поля зрения такую возможность.
--
Не можешь достичь желаемого — пожелай достигнутого.