Can std::make_unique be used with abstract interface?
Solution 1
Yes, you can of course use make_unique
for that, but it's not as useful as you might want. You have these options:
std::unique_ptr<IGpsSource> source1 = std::make_unique<GpsDevice>(comPort, baudrate);
auto source2 = std::unique_ptr<IGpsSource>{ std::make_unique<GpsLog>(filename) };
I would say the real question is "why do you want that?"
Unlike
make_shared
,make_unique
has no allocation benefits overnew
. So if you need control of the pointer's type, what you're doing is just fine.Why do you need the pointer to be typed to
IGpsSource
in the first place? An implicit conversion fromstd::unique_ptr<Derived>
rvalues tostd::unique_ptr<Base>
rvalues exists. So if you're actually callingmake_unique
to initialise anIGpsSource
pointer, it will work just fine. And if you want to transfer the pointer somewhere, you'll have tostd::move
it anyway, at which point the conversion can happen again.
Solution 2
std::unique_ptr<Base> base_ptr = std::make_unique<Derived>();
As Angew said, the above should work fine. Provided Derived
uses public inheritance. Just wanted to add that for completeness.
Related videos on Youtube
Boris
Updated on September 15, 2022Comments
-
Boris over 1 year
Consider the following line of code:
auto source1 = std::unique_ptr<IGpsSource>(new GpsDevice(comPort, baudrate)); auto source2 = std::unique_ptr<IGpsSource>(new GpsLog(filename));
How can that be written using the new
std::make_unique
function, supported by VS 2013? Is it even possible?**My problem is that I don't know how to tell
std::make_unique
what kind of object to instantiate. Because only the constructor's parameters are passed in there seems to be no control over that.-
Angew is no longer proud of SO@MarcoA. VS2013 supports a few C++14 bits, and
make_unique
is one of them.
-
-
Ruslan over 7 yearsException safety argument from this answer still applies to
make_unique
, not only tomake_shared
. So,make_unique<Xyz>()
should be preferred overunique_ptr(new Xyz)
. -
Angew is no longer proud of SO over 7 years@Ruslan Note that the exception safety criterion applies to multiple allocations being done in a single expression. The OP's case is quite different: they have only a single allocation, and want precise control over the pointer's type.
-
Kevin over 5 years@ajmal-kunnummai's answer makes more succinct use of
std::make_unique()
.