Quite a few times, I've made C++ library APIs like this:
struct iface
{
virtual ~iface(){ }
virtual void doSomething() = 0;
static std::unique_ptr<iface> create();
}
I don't know good ways to replace unique_ptr here.
Requiring library users to #include the concrete implementation is not good: inflates compilation time, pollutes namespaces, pollutes IDE's autocompletion DB.
Can go C-style i.e. pass double pointer argument to the factory, or return raw pointer. But then user needs to remember to destroy the object.