Иногда при кодировании с помощью шаблонов C ++ вы хотите запретить пользователям создавать конкретную специализацию или набор специализаций, потому что результат будет бессмысленным.Таким образом, вы можете определить (конкретную или частичную) специализацию, определение которой, в случае ее создания, приведет к ошибке компилятора.Цель состоит в том, чтобы, если пользователь «злоупотребляет» шаблоном, вызвать ошибку компилятора рядом с комментарием в заголовочном файле с объяснением того, чего не следует делать, вместо того, чтобы компилятор выдавал какое-то непонятное сообщение об ошибке самостоятельноустройства, или, возможно, позволяет сомнительный код для компиляции.
Пример:
template <typename T> struct MyClassTemplate {
// ...
};
template <typename T> struct MyClassTemplate<T*> {
// Do not use MyClassTemplate with a pointer type!
typedef typename T::intentional_error err;
};
Есть несколько способов сделать это (в зависимости от того, является ли ваша специализация полной или частичной специализациейкласс или функция).Но используемый синтаксис должен (?) Зависеть от параметра шаблона, иначе компилятор будет жаловаться при первом анализе определения преднамеренной ошибки.В приведенном выше примере есть дыра в том, что кто-то может упрямо определить вложенный тип intentional_error
или тип typedef (хотя я бы сказал, что тогда они заслуживают любых проблем, возникающих в результате).Но если вы используете слишком хитрый трюк, вы, скорее всего, получите сообщение об ошибке нерасшифруемого и / или вводящего в заблуждение компилятора, которое в основном не соответствует цели.
Существуют ли более простые и понятные способы запретить создание экземпляров шаблона?
Я знаю, что в C ++ 0x шаблонные концепции и объявления удаленных функций обеспечат намного лучший контроль над такими вещами, но я ищу ответы, которые действительны в C ++ 03.