Я хотел бы определить функцию шаблона, но запретить создание экземпляра с определенным типом. Обратите внимание, что в целом разрешены все типы и общий шаблон работает, я просто хочу запретить использование нескольких конкретных типов.
Например, в приведенном ниже коде я хочу предотвратить использование double
с помощью шаблона. Это фактически не предотвращает создание экземпляра, а просто вызывает ошибку компоновщика, не определяя определенную функцию.
template<typename T>
T convert( char const * in )
{ return T(); }
//this way creates a linker error
template<>
double convert<double>( char const * in );
int main()
{
char const * str = "1234";
int a = convert<int>( str );
double b = convert<double>( str );
}
Код - это просто демонстрация, очевидно, что функция преобразования должна делать что-то еще.
Вопрос: В приведенном выше коде как я могу создать ошибку компилятора при попытке использовать экземпляр convert<double>
?
Ближайший связанный вопрос, который я могу найти, Как преднамеренно вызвать ошибку времени компиляции при создании экземпляра шаблона. Он относится к классу, а не к функции.
Причина, по которой мне нужно это сделать, - это то, что типы, которые я хочу заблокировать, будут фактически компилироваться и делать что-то с общей версией. Это, однако, не должно быть частью контракта функции и может не поддерживаться на всех платформах/компиляторах и в будущих версиях. Поэтому я хотел бы вообще не использовать его.