Сообщение Re: хочуфичу - функции-конструкторы от 27.12.2023 18:06
Изменено 27.12.2023 18:38 rg45
Re: хочуфичу - функции-конструкторы
Здравствуйте, Кодт, Вы писали:
К>Которая плоха тем, что при несоответствии типов аргументов формирует громоздкие ошибки.
К>Вот было бы здорово как-то говорить компилятору "этот набор аргументов — такой же, как для вот такого семейства функций"
К>
К>чтобы потом компилятор говорил это юзеру.
Так а констрейнты чем плохи?
http://coliru.stacked-crooked.com/a/0fa0a68239368aa3
Можно даже не полениться и объявить концепт:
http://coliru.stacked-crooked.com/a/274819e724ed731c
К>Которая плоха тем, что при несоответствии типов аргументов формирует громоздкие ошибки.
К>Вот было бы здорово как-то говорить компилятору "этот набор аргументов — такой же, как для вот такого семейства функций"
К>
К>template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args) [[signature_like ( T::T(Args&&...) ) ]]
К>
К>чтобы потом компилятор говорил это юзеру.
Так а констрейнты чем плохи?
http://coliru.stacked-crooked.com/a/0fa0a68239368aa3
template <typename T, typename...A>
requires requires(A&&...args) { T{std::forward<A>(args)...}; }
T make(A&&... args) { return T{std::forward<A>(args)...}; }
int main()
{
make<Foo>(Bar{});
make<Foo>(Buz{}, Xyz{});
// make<Foo>(42); // error: no matching function for call to 'make<Foo>(int)'
}
Можно даже не полениться и объявить концепт:
http://coliru.stacked-crooked.com/a/274819e724ed731c
template <typename T, typename...A>
concept Constructible = requires(A&&...args) { T{std::forward<A>(args)...}; };
template <typename T, typename...A>
requires Constructible<T, A...>
T make(A&&... args) { return T{std::forward<A>(args)...}; }
Re: хочуфичу - функции-конструкторы
Здравствуйте, Кодт, Вы писали:
К>Которая плоха тем, что при несоответствии типов аргументов формирует громоздкие ошибки.
К>Вот было бы здорово как-то говорить компилятору "этот набор аргументов — такой же, как для вот такого семейства функций"
К>
К>чтобы потом компилятор говорил это юзеру.
Так а констрейнты чем плохи?
http://coliru.stacked-crooked.com/a/a1a066dba3fa77e9
Можно даже не полениться и объявить концепт:
http://coliru.stacked-crooked.com/a/a288792cc15b585f
К>Которая плоха тем, что при несоответствии типов аргументов формирует громоздкие ошибки.
К>Вот было бы здорово как-то говорить компилятору "этот набор аргументов — такой же, как для вот такого семейства функций"
К>
К>template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args) [[signature_like ( T::T(Args&&...) ) ]]
К>
К>чтобы потом компилятор говорил это юзеру.
Так а констрейнты чем плохи?
http://coliru.stacked-crooked.com/a/a1a066dba3fa77e9
template <typename T, typename...A>
requires requires(A&&...args) { T{std::forward<A>(args)...}; }
std::shared_ptr<T> make_shared(A&&... args) { return std::make_shared<T>(std::forward<A>(args)...); }
int main()
{
make_shared<Foo>(Bar{});
make_shared<Foo>(Buz{}, Xyz{});
// make_shared<Foo>(42); // error: no matching function for call to 'make_shared<Foo>(int)'
}
Можно даже не полениться и объявить концепт:
http://coliru.stacked-crooked.com/a/a288792cc15b585f
template <typename T, typename...A>
concept Constructible = requires(A&&...args) { T{std::forward<A>(args)...}; };
template <typename T, typename...A>
requires Constructible<T, A...>
std::shared_ptr<T> make_shared(A&&... args) { return std::make_shared<T>(std::forward<A>(args)...); }