This is an abstract factory pattern.
It uses std::is_same with if constexpr (C++17) to deduct the return type of abstractfactory::factoryProducer at compile-time.
#include "AbstractFactory.hpp"
#include "ShapeFactory.hpp"
int main()
{
using namespace abstractfactory;
using namespace shapefactory;
auto rectFactory = factoryProducer(FactoryTag::shape)(ShapeTag::rectangle);
auto shape = rectFactory();
shape->draw();
return 0;
}In this diagram you can see that the AbstractFactory module (AbstractFactory.hpp) returns a function (in this case shapeFactoryProducer) that can produce a factory based on a parameter (a tag). This factory (RectangleFactory) can later be called to generate objects when needed.
The behaviour and tags can be customised to generate anything at any time, by using unique_ptr no data is copied which is best for performance.