Size: a a a

2021 February 23

W

Wild_Wind in pro.cxx
При том, что на функциях - работает.
https://godbolt.org/z/GaK1Ma
источник

RP

Roman Proskuryakov in pro.cxx
Anatoly Shirokov
Оффтоп: Встроенный SQL - антипаттерн. RPC и кодогенерация по формальному описанию сигнатуры спасет мир :)
А это уже не важно, можно во время компиляции хоть ходить в субд, проверять запросы на тестовой схеме, как это делает растовый https://github.com/launchbadge/sqlx. Главное иметь возможность оперировать типами и рефлексией.
источник

АК

Александр Караев... in pro.cxx
-fconcepts-diagnostics-depth=2 в gcc показал, что он считает T::name ссылкой на std::string, из-за чего фейлится
источник

D

Danya in pro.cxx
Ты неправильно делаешь
источник

W

Wild_Wind in pro.cxx
Danya
Ты неправильно делаешь
А как правильно?
Я хочу компилтайм диспатчинг на концептах.
источник

АК

Александр Караев... in pro.cxx
Wild_Wind
А как правильно?
Я хочу компилтайм диспатчинг на концептах.
template <class T>
concept has_string_name = std::same_as<decltype(T::name), std::string>;
источник

D

Danya in pro.cxx
Александр Караев
template <class T>
concept has_string_name = std::same_as<decltype(T::name), std::string>;
+
источник

W

Wild_Wind in pro.cxx
Александр Караев
template <class T>
concept has_string_name = std::same_as<decltype(T::name), std::string>;
Опять портянки темплейтов...
источник

АК

Александр Караев... in pro.cxx
Wild_Wind
Опять портянки темплейтов...
я бы написал так всё это:
template <class T>
concept is_option = requires {
   requires std::same_as<decltype(T::name), std::string>;
   requires std::same_as<decltype(T::description), std::string>;
   requires std::same_as<decltype(T::short_name), std::optional<std::string>>;
};

(в данном случае лучше упростить до &&, но если внутри будут какие-то ещё требования, кроме полей, то лучше именно так)
источник

W

Wild_Wind in pro.cxx
Александр Караев
я бы написал так всё это:
template <class T>
concept is_option = requires {
   requires std::same_as<decltype(T::name), std::string>;
   requires std::same_as<decltype(T::description), std::string>;
   requires std::same_as<decltype(T::short_name), std::optional<std::string>>;
};

(в данном случае лучше упростить до &&, но если внутри будут какие-то ещё требования, кроме полей, то лучше именно так)
Спасибо.
Можешь кинуть что-нибудь почитать/доклады по концептам?
источник

АК

Александр Караев... in pro.cxx
Wild_Wind
Спасибо.
Можешь кинуть что-нибудь почитать/доклады по концептам?
Выработанных практик ещё нет, поэтому всё исключительно на собственном небольшом опыте
источник

W

Wild_Wind in pro.cxx
Александр Караев
Выработанных практик ещё нет, поэтому всё исключительно на собственном небольшом опыте
Ясно :(
источник

DP

Denis Paukaev in pro.cxx
Александр Караев
-fconcepts-diagnostics-depth=2 в gcc показал, что он считает T::name ссылкой на std::string, из-за чего фейлится
он там вроде берёт decltype((T::name)) для такой конструкции
источник

AP

Antony Polukhin in pro.cxx
И Ivan
Ну можно какнибудь через + склеивать. Мне вообще кажется такое определение через "параметры отдельно, значения отдельно" контринтуитивным, не только в sql
Увы, в SQL prepared statements пишутся только с подобным синтаксисом. Ну и на библиотеке не стоит задача их склеивать, хорошая библиотека превратит этот запрос один раз в хранимку а потом должна только проверять, что количество аргументов верное, и передавать только аргументы, без тела SQL запроса
источник

W

Wild_Wind in pro.cxx
Синтаксис: type func(some_concept auto args); // Не приняли?
Ибо type func(some_concept args); - отклонили.
А писать template</*....*/> ещё раз не хочется, т.к. он в концепте уже раз написан.
источник

DP

Denis Paukaev in pro.cxx
Wild_Wind
Синтаксис: type func(some_concept auto args); // Не приняли?
Ибо type func(some_concept args); - отклонили.
А писать template</*....*/> ещё раз не хочется, т.к. он в концепте уже раз написан.
почему не приняли?
источник

W

Wild_Wind in pro.cxx
Denis Paukaev
почему не приняли?
А, пардон. Забыл дропнуть кеш смака. Всё работает.
источник

АК

Александр Караев... in pro.cxx
Wild_Wind
Синтаксис: type func(some_concept auto args); // Не приняли?
Ибо type func(some_concept args); - отклонили.
А писать template</*....*/> ещё раз не хочется, т.к. он в концепте уже раз написан.
Этот синтаксис ещё почти никем не поддерживается. Только недавно в один из компиляторов завезли, емнип
источник

W

Wild_Wind in pro.cxx
Александр Караев
Этот синтаксис ещё почти никем не поддерживается. Только недавно в один из компиляторов завезли, емнип
Clang-11.0.1 и gcc-10.2 вполне поддерживают.
источник

АК

Александр Караев... in pro.cxx
Wild_Wind
Clang-11.0.1 и gcc-10.2 вполне поддерживают.
Круто! Видимо, я отстал от жизни.
источник