Date: Sun, 01 Dec 2024 18:57:41 +0200
On Sun, 2024-12-01 at 19:11 +0300, Andrey Semashev via Std-Proposals
wrote:
> On December 1, 2024 6:57:16 PM Avi Kivity via Std-Proposals
> <std-proposals_at_[hidden]> wrote:
>
> > Functions and member functions are invocable, but constructors are
> > not.
> >
> > I propose to add
> >
> > template <typename T, typename... Args>
> > T std::construct(Args&&... args) {
> > return T(std::forward<decltype(Args)>(args)...);
> > }
> >
> > With this, we can pass a constructor where other functions can be
> > passed.
> >
> > // build a callback that creates and returns a Type1 thing
> > std::function<Type1 (Arg3)> make_somthing =
> > std::bind_front(std::construct<Type1>, arg1, std::ref(arg2));
> >
> > // transform a vector of ints to a vector of some other type
> > auto foo = some_container |
> > std::views::transform(std::construct<AnotherType>) |
> > std::ranges::to<std::vector>();
>
> Binding a function pointer is less efficient than a function object.
Typically, inlining will remove the difference. Or we can make it a
niebloid.
> And
> given that lambdas are an easy way to create function objects, I
> don't
> really see the benefits of the proposal.
>
>
I believe that writing
std::views::transform(std::construct<AnotherType>)
is more readable than
std::views::transform([] (auto&& x) { return
AnotherType<std::forward<decltype(x)>(x); });
wrote:
> On December 1, 2024 6:57:16 PM Avi Kivity via Std-Proposals
> <std-proposals_at_[hidden]> wrote:
>
> > Functions and member functions are invocable, but constructors are
> > not.
> >
> > I propose to add
> >
> > template <typename T, typename... Args>
> > T std::construct(Args&&... args) {
> > return T(std::forward<decltype(Args)>(args)...);
> > }
> >
> > With this, we can pass a constructor where other functions can be
> > passed.
> >
> > // build a callback that creates and returns a Type1 thing
> > std::function<Type1 (Arg3)> make_somthing =
> > std::bind_front(std::construct<Type1>, arg1, std::ref(arg2));
> >
> > // transform a vector of ints to a vector of some other type
> > auto foo = some_container |
> > std::views::transform(std::construct<AnotherType>) |
> > std::ranges::to<std::vector>();
>
> Binding a function pointer is less efficient than a function object.
Typically, inlining will remove the difference. Or we can make it a
niebloid.
> And
> given that lambdas are an easy way to create function objects, I
> don't
> really see the benefits of the proposal.
>
>
I believe that writing
std::views::transform(std::construct<AnotherType>)
is more readable than
std::views::transform([] (auto&& x) { return
AnotherType<std::forward<decltype(x)>(x); });
Received on 2024-12-01 16:57:50