Информация об изменениях

Сообщение Re: хочуфичу - функции-конструкторы от 27.12.2023 18:06

Изменено 27.12.2023 18:26 rg45

Re: хочуфичу - функции-конструкторы
Здравствуйте, Кодт, Вы писали:

К>Которая плоха тем, что при несоответствии типов аргументов формирует громоздкие ошибки.


К>Вот было бы здорово как-то говорить компилятору "этот набор аргументов — такой же, как для вот такого семейства функций"

К>
К>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: хочуфичу - функции-конструкторы
Здравствуйте, Кодт, Вы писали:

К>Которая плоха тем, что при несоответствии типов аргументов формирует громоздкие ошибки.


К>Вот было бы здорово как-то говорить компилятору "этот набор аргументов — такой же, как для вот такого семейства функций"

К>
К>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)...}; }