Я собираюсь описать мою проблему подробно, чтобы объяснить, чего я пытаюсь достичь, вопрос в последнем параграфе, если вы хотите игнорировать детали моей проблемы.
У меня естьпроблема с дизайном класса, в которой я хочу передать значение любого типа в функции push()
и pop()
, которые преобразуют переданное значение в строковое представление, которое будет добавлено к строке внутри класса, эффективно создавая потокданных.Обратное произойдет для pop()
, взяв поток и преобразовав несколько байтов в начале потока обратно в указанный тип.
Создание шаблонов push()
и pop()
, связанных с stringstream
, являетсяочевидное решение.Однако я хочу использовать эту функцию внутри DLL, в которой я могу изменить способ хранения строки (например, шифрование или сжатие) без перекомпиляции клиентов.Шаблон типа T
необходимо будет перекомпилировать при изменении алгоритма.
Моя следующая идея состояла в том, чтобы просто использовать такие функции, как pushByte()
, pushInt()
, popByte()
, popInt()
и т. Д.Это позволило бы мне изменить реализацию без перекомпиляции клиентов, поскольку они полагаются только на статический интерфейс.Это было бы хорошо.Тем не менее, это не так гибко.Например, если значение было изменено с байта на короткое, все экземпляры pushByte (), соответствующие этому значению, нужно было бы изменить на pushShort()
, аналогично для popByte()
на popShort()
.Перегрузка pop()
и push()
для борьбы с этим может привести к конфликтам в типах (вызывая явное приведение, которое в конечном итоге приведет к той же самой проблеме).
С вышеупомянутыми идеями я мог бы создать рабочий класс.Однако мне было интересно, как компилируются специализированные шаблоны.Если бы я создал push<byte>()
и push<short>()
, это была бы перегрузка, зависящая от типа, и переход от байта к короткому автоматически переключал бы используемый шаблон, что было бы идеально.
Теперь мой вопрос таков:если бы я использовал специализированные шаблоны только для имитации этого вида перегрузки (без шаблона типа T
), все ли специализации компилировались бы в мою DLL, позволяя мне отправлять новую реализацию без перекомпиляции клиента?Или специализированные шаблоны выбираются или отбрасываются таким же образом, как шаблон типа T
во время компиляции клиента?