Я подробно расскажу о своей проблеме, чтобы объяснить, что я пытаюсь достичь, вопрос находится в последнем абзаце, если вы хотите игнорировать детали моей проблемы.C++ Template Specialization Compilation
У меня проблема с дизайном класса, в котором я хочу передать значение любого типа в 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
во время компиляции клиента?
Некоторые указатели на специализацию шаблона и перегрузку от Herb Sutter. http://gotw.ca/gotw/049.htm – DumbCoder
Почему для перегрузок требуется явное литье, которое пользователь переключает? –
Если я передал короткую функцию, перегруженную с помощью push (byte), push (short) и push (int), не вызовет ли это конфликт, в котором функция может выбирать из push (short) и push (int)? Короткое может быть передано и в любом случае. –