с автоматическим преобразованием в «Activity<Item>», то есть, когда Impl становится неким стандартным. Теперь я хочу создать концепт «template<typename From, To> concept ActivityLike = std::convertible_to<From, Activity<To>>». Далее, есть куча функций вида «template<typename MapItem, typename MapFn> auto map(MapFn&&)», где автоматически выводится тип результата. Там получается что-то типа «Activiity<MapItem, SomeComplexImpl>». Вот, и я хочу в сигнатуре функции явно сказать, что некий выводимый тип результата Res удовлетворяет концепту «ActivityLike<Res, MapItem>». Все было бы просто, если бы в коде можно было бы явно ссылаться на тип Res, но он выводится, и там стоит «auto». Если попытаться ввести Res явно, то ломается выводилка типов у GCC. Может, у кого есть идеи? Или просто укажите хорошее введение по концептам с погружением. Все утро перед работой голову ломал. Если что, это хобби в свободное время. Коллег так мучать не стал бы)
У bfilipek в его блоге, вроде бы, было.. Хотя там я линк видел на этот блог, тут автор рассматривает, как можно коньцепт: https://mariusbancila.ro/blog/2019/09/12/cpp20-concepts-in-visual-studio-2019-16-3-preview-2/
Концепты обычно применяют для того чтобы ограничить входные параметры. Результат функции описывать концептом звучит немного странно, но я не очень хорошо знаком с ними. Кажется этого можно добиться если явно определить тип результата. Что-нибудь такого плана: template<typename MapItem, typename MapFn, typename Result = ...> Result map(MapFn&&) requires ActivityLike<Result> { ... }
Как уже было сказано, обычно концепты используют для входных параметров Единственным, как мне кажется, решением тут может быть кучка static_assert'ов, на вызов функции при разных шаблонных параметрах
UPD: кажется, я был не прав Сейчас открыл Release notes для CLion 2020.2 — можно констрейнить возвращаемое значение https://blog.jetbrains.com/clion/2020/07/clion-2020-2-makefile-cpp20-doctest/
Обсуждают сегодня