Шаблон "Адаптеры" в C ++ - PullRequest
       3

Шаблон "Адаптеры" в C ++

1 голос
/ 19 августа 2011

У меня сейчас проблема с шаблонными классами. В кодовой базе, с которой я сейчас работаю, есть строка примерно такая:

Register<uint32_t>* myReg = static_cast<Register<uint32_t>*>(importItemPtr(someGlobalIdString));

, где importItemPtr отвечает за возврат void * элементу из некоторой глобальной коллекции на основе идентифицирующей строки.

Проблема в том, что этот код теперь будет работать на платформе, где объект, на который ссылается someGlobalIdString, больше не будет иметь тип Register<uint32_t>, а вместо этого Register<uint64_t>. Это решение, которое должно быть принято во время выполнения. Поскольку я использую шаблонизированные типы, у меня не может быть единственного указателя, который может указывать на Register<uint32_t> или Register<uint64_t>. Так что я должен либо

  1. Иметь две копии класса, который импортирует этот регистр, один, который обрабатывает типы uint32_t, и другой, который обрабатывает типы uint64_t. Это решение явно отстой из-за дублирования кода.
  2. Шаблонизировать класс, который импортирует этот регистр. В идеальном мире это, вероятно, правильное решение, но оно не совсем соответствует «нормальному способу ведения дел», и остальные коллеги, вероятно, предпочли бы копировать и вставлять шаблоны этого типа.
  3. Сделать переходник. Подкласс Register<uint64_t> для создания нового класса, который принимает Register<uint32_t> в качестве конструктора и, по сути, просто переносит регистр и возвращает 64-битные значения вместо 32. Перепишите класс потребления, чтобы всегда использовать 64-битную версию и когда мы на платформа, которая предоставляет 32-битную версию, просто оберните ее. Сегмент кода выше будет выглядеть примерно так:

Адаптер:

class Reg32to64Adapter : public Register<uint64_t> { ... }

Класс потребления:


Register* myReg; 
if( is32bitPlatform )
{
    Register* my32Reg = static_cast*>(importItemPtr(someGlobalIdString));
    myReg = new Reg32to64Adapter(my32Reg);
}else
{
    myReg = static_cast*>(importItemPtr(someGlobalIdString));
}

//Go on manipulating myReg

Есть ли лучшее решение там? Какой-то шаблон дизайна, о котором я не знаю?

1 Ответ

0 голосов
/ 20 августа 2011

Попробуйте использовать шаблон моста, где Implementor представляет собой набор общих операций, а специализация - это ConcreteImplementors.

http://en.wikipedia.org/wiki/Bridge_pattern

Вероятно, не лучшее решение (избыточный дизайн), поэтому, пожалуйста, проанализируйте его перед использованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...