Иногда при кодировании с шаблонами С++ вы хотите запретить пользователям создавать экземпляр определенной специализации или набора специализаций, потому что результат будет бессмысленным. Таким образом, вы можете определить (конкретную или частичную) специализацию, чье определение, если оно было создано, вызовет ошибку компилятора. Целью было бы, если пользователь "злоупотребляет" шаблоном, выдает ошибку компилятора рядом с комментарием в вашем файле заголовка, объясняя, что не делать, вместо того, чтобы оставлять компилятор придумать какое-то запутанное сообщение об ошибке своим собственным устройств или, возможно, позволяет компилировать сомнительный код.
Пример:
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 (хотя я бы сказал, что тогда они заслуживают любых проблем, возникающих в результате). Но если вы используете слишком увлекательный трюк, вы, вероятно, получите сообщение об ошибке, которое нечеткое и/или вводящее в заблуждение сообщение компилятора, которое в основном побеждает цель.
Есть ли более простые способы запретить создание шаблонов?
Я знаю, что в С++ 0x объявления шаблонов Concepts и удаленных функций обеспечат намного лучший контроль над такими вещами, но я ищу ответы, которые являются допустимыми С++ 03.