Распространённая идиома на плюсах (на сях она вынужденная) — это мейкфункция: декоратор конструктора.
class Foo {
public:
Foo(Bar);
Foo(Buz, Xyz);
...
};
// руками написать
Foo make_foo(auto&&... args) { return Foo(std::forward<decltype(args)>(args)...); }
// стандартными воспользоваться
std::optional<Foo> o(std::in_place, .....);
auto u = std::make_unique<Foo>(.....);
auto s = std::make_shared<Foo>(.....);
Которая плоха тем, что при несоответствии типов аргументов формирует громоздкие ошибки.
Вот было бы здорово как-то говорить компилятору "этот набор аргументов — такой же, как для вот такого семейства функций"
template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args) [[signature_like ( T::T(Args&&...) ) ]]
чтобы потом компилятор говорил это юзеру.
Может, у кого-нибудь ещё есть схожие хотелки вокруг этого? Чтоб помечтать к следующему стандарту?