Как преднамеренно вызвать ошибку во время компиляции при создании шаблона

Иногда при кодировании с помощью шаблонов 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 шаблоны Concepts и объявления удаленных функций обеспечат намного лучший контроль над такими вещами, но я ищу ответы, которые действительны для C ++ 03.

Ответы на вопрос(6)

Ваш ответ на вопрос