Я пытаюсь создать шаблон для работы только с двойным и определяемым пользователем типом. Пользователь может выбрать пользовательский тип с помощью typedef во включенном файле заголовка.Пропуск явной инициализации шаблона, чтобы избежать двойной инициализации
typedef float Usertype;
Я решил эту проблему, написав следующее в конце моего шаблона исходных файлов:
template class SpaceDiscretizer<Datatype::Usertype>;
template class SpaceDiscretizer<double>;
Однако я столкнулся с проблемой, когда пользователь определяет UserType в два раза! Я пытался следовать некоторым направлениям, а именно эти темы: How can I provide template specializations for typedefs of the same type?, Conditional explicit template instantiation
struct dummy{};
template class SpaceDiscretizer< std::conditional<std::is_same<double,Datatype::Usertype>::value, dummy, double>::type>;
//typedef typename std::enable_if<false,double>::type mytype;
//template class SpaceDiscretizer<mytype>;
template class SpaceDiscretizer<Datatype::Usertype>;
Первый не работает, потому что если SpaceDiscretizer инициализируется ничем не осложненного, за исключением двойной, он не работает. Но я хочу дать пользователю простой способ добавить рабочую альтернативу двойной функции. Вторая попытка (прокомментированная) пытается выйти из строя, потому что это не перегрузка, и если тип не существует, mytype не будет проигнорирован, но вместо этого выдается ошибка.
Edit: У меня есть много мест, где я не использовать шаблон или должен гарантировать, что несколько несвязанных классов используют один и тот же тип данных. Мне нужно сохранить реализацию в файле .cpp. Чтобы решить эту проблему, я включаю заголовочный файл во все соответствующие места, чтобы пользователь мог изменить значение в одном месте и все это было согласованным. Возникает проблема, потому что я всегда хочу инициализировать двойную, но для пользователя было бы естественно указать double как Usertype.
Что-то в этом проекте поражает меня как-то необычно. Что мешает кому-то делать что-то вроде 'using UserType = int', а затем явно писать' SpaceDiscretizer '? Это не то, что вы хотели бы разрешить, но в этом случае это совершенно законно. Я подозреваю, что вы, возможно, пытаетесь сделать что-то не так. –
templatetypedef
информации в вопросе. однако кажется, что SpaceDiscretizer <> зависит от некоторого члена Datatype :: Usertype, которого нет в двойном. –
@templatetypedef Идея состоит в том, что я рассматриваю заголовочный файл как свой собственный или образованный мир разработчиков, так и чистое использование SpaceDiscretizer в качестве ошибки «конечного пользователя». –