Hi Avi,

what you are describing is a factory function.

A few months back we were discussing Thomas' and my suggestion of a std::factory or std::construct_modify in the context of NRVO together with a version for free functions.

 

The only difference was the added possibility to also modify or inspect the returned value freely without copy or move.

 

P3357

https://github.com/cplusplus/papers/issues/2013

 

The construct template function would be half of it.

-----Ursprüngliche Nachricht-----
Von: Avi Kivity via Std-Proposals <std-proposals@lists.isocpp.org>
Gesendet: So 01.12.2024 16:57
Betreff: [std-proposals] std::construct<T>
An: std-proposals <std-proposals@lists.isocpp.org>;
CC: Avi Kivity <avi@scylladb.com>;
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>();
--
Std-Proposals mailing list
Std-Proposals@lists.isocpp.org
https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals