Мало того, что вы не можете изменить operator new
, чтобы делать то, что вы хотите (это только функция распределения), вы не должны.Подрыв значения нового выражения усложнит понимание вашего кода, без каких-либо преимуществ .
Если вам нужна новая функциональность, напишите код!Здесь вам может понадобиться класс (мы не можем сказать) или просто функция:
template<typename T, typename... U>
std::shared_ptr<T> // for one std::shared_ptr seems appropriate
make(U&&... u);
Затем клиентский код использует эту фабричную функцию для получения нужных ему объектов.Что на самом деле делает функция ?Кеширует ли он объекты с помощью шаблона Flyweight?Кеширует ли он память вместо объектов?Код клиента не волнует и не хочет .Все, что его волнует, - это то, что он получает объект, который запрашивает.
Между тем, код в функции делает все, что ему нужно.Если завтра вы поймете, что ошиблись, вы можете изменить код внутри, и, надеюсь, это не повлияет на все остальное.По крайней мере, у него есть шанс на победу.