У меня сейчас проблема с шаблонными классами. В кодовой базе, с которой я сейчас работаю, есть строка примерно такая:
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>
. Так что я должен либо
- Иметь две копии класса, который импортирует этот регистр, один, который обрабатывает типы uint32_t, и другой, который обрабатывает типы uint64_t. Это решение явно отстой из-за дублирования кода.
- Шаблонизировать класс, который импортирует этот регистр. В идеальном мире это, вероятно, правильное решение, но оно не совсем соответствует «нормальному способу ведения дел», и остальные коллеги, вероятно, предпочли бы копировать и вставлять шаблоны этого типа.
- Сделать переходник. Подкласс
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
Есть ли лучшее решение там? Какой-то шаблон дизайна, о котором я не знаю?