Высокопроизводительный шаблон декоратора для структурированных объектов

Представьте, что у меня большая структура данных, скажем, огромная vector, чье создание не находится под моим контролем (т.е. я не могу изменить его статический тип), содержащее объекты класса InitialFunctionality, В C ++:

class InitialFunctionality
{
public:
void iCanDoThis();
}

hugeVector vector<InitialFunctionality>; // <- lots of elements inside! :)

Моя цель состоит в том, чтобы динамично расширить функциональность InitialFunctionality объекты в hugeVector с минимальным влиянием на производительность, скажем,

class ExtraFunctionality: public InitialFunctionality
{
public:
int iOfferThisToo;
}

Хорошо известный Выкройка декоратора отлично работает для неструктурированных объектов. Вы можете использовать его для динамического расширения функциональности объектов из InitialFunctionality класс и с радостью раздают их.

Но как расширить объекты в hugeVector без изменения порядка и с наименьшим влиянием на производительность? Например, дублирование вектора не допускается из-за его размера.

Я думал об использовании какого-то адаптер для вектора, который сохраняет ссылку на оригинал hugeVector и лениво преобразует содержащиеся объекты по требованию (то есть при доступе к адаптированным векторным элементам). Однако, кроме самого преобразования (т.е. инициализации iOfferThisToo), что требуется для любого метода, для этого необходимо сохранить кэш, чтобы проверить, был ли объект уже преобразован или нет. Такой кеш может быть действительно дорогим.

3

Решение

Если вы не добавляете дополнительных участников, вы можете сделать что-то вроде:

class myInternalFunctionality : public InternalFunctionality {
public:
//new features
void ICanDoThis();

private:
// disable all ctors
};

и затем переделать указатели на InternalFunctionality в векторе.

myInternalFunctionality* myInternalPtr = &hugeVector[i];
myInternalPtr->ICanDoThis();

Так как вы, я думаю, у вас есть некоторые проблемы.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]