I have a function f returning a char*. The function documentation says:
The user must delete returned string
I wa
std::string steal_char_buffer( std::unique_ptr buff ) {
std::string s = buff?buff.get():""; // handle null pointers
return s;
}
std::string steal_char_buffer( const char* str ) {
std::unique_ptr buff(str); // manage lifetime
return steal_char_buffer(std::move(buff));
}
now you can type
std::string s = steal_char_buffer(f());
and you get a std::string out of f().
You may want to make the argument of steal_char_buffer be a const char*&&. It is mostly pointless, but it might lead to some useful errors.
If you can change the interface of f, make it return a std::string directly or a std::unique_ptr.
Another good idea is to wrap f in another function that returns a std::unique_ptr or std::string:
std::unique_ptr good_f() {
return std::unique_ptr(f());
}
and/or
std::string good_f2() {
auto s = good_f();
return steal_char_buffer( std::move(s) );
}