Итак, я получил класс, который определяет константу со специальным значением для каждого типа.Я использую что-то подобное
template<class Type>
class SpecialKeyProvider
{
static const Type SPECIAL_KEY;
}
с одной или несколькими специализациями для типов, которые также будут использоваться, но не являются числовыми.Поэтому я инициализирую статический член вне определения класса следующим образом:
// This seems to have to be in a cpp as having it in the same header,
// will result in duplicate definitions of SPECIAL_KEY;
// This particular instantiation is kind of problematic anyways, see
// the end of my question for another question on this one.
template<>
string SpecialKeyProvider<string>::SPECIAL_KEY = "__SPECIAL";
template <class Type>
Type SpecialKeyProvider<Type> = std::numeric_limits<Type>::max();
К сожалению, SpecialKeyProvider используется в самом центральном классе-контейнере.Этот контейнер имеет много методов, которые должны быть встроены из соображений производительности, и используется во многих местах.Поэтому я поместил весь контейнер в заголовочный файл.Но теперь, когда используется SpecialKeyProvider, мне все еще нужно связать SpecialKeyProvider.o практически со всеми двоичными файлами в моем проекте.
Есть ли способ избавиться от этого и выполнить специализацию шаблона в заголовкебез получения ошибки из-за «нескольких определений»?
Второй вопрос, касающийся строковой константы.
// I know this is bad code but I don't know how to do it better.
template<>
string SpecialKeyProvider<string>::SPECIAL_KEY = "__SPECIAL";
Я знаю (и напоминание напоминает мне), что использование констант любого типа класса вообще плохая идея из-за неопределенного порядка построения( Руководство по стилю Google ), в частности строки.Хотя я обычно могу вместо этого использовать const char [], я не знаю, что делать в этом случае, так как я хочу, чтобы шаблон создавался для строк.Использование шаблона (т.е. использование моего класса контейнера, в котором использовался SpecialKeyProvider) с char * вместо этого было бы невероятно болезненным.
Я действительно благодарен за любой совет.