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

Иногда при кодировании с использованием шаблонов 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 вложенный тип или член ЬурейеЕ (хотя я бы сказал, что они бы тогда заслуживают все, что проблемы появляются в результате). Но если вы воспользуетесь хитроумным трюком, вы, вероятно, получите неразборчивое и / или вводящее в заблуждение сообщение об ошибке компилятора, что в большинстве случаев противоречит цели.

Есть ли более простые способы запретить создание экземпляров шаблонов?

Я известно, что в C ++ 0x, Шаблонные концепции и объявления удаленных функций обеспечат гораздо лучший контроль над подобными вещами, но я ищу ответы, действительные для C ++ 03.

25
задан aschepler 13 October 2010 в 18:11
поделиться