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

У меня есть шаблонный class (назовите его Foo ), который имеет несколько специальностей. Я хотел бы, чтобы компиляция завершилась неудачей, если кто-то попытается использовать неспециализированную версию Foo .

Вот что я на самом деле имею:

 template  class Foo { Foo() { cannot_instantiate_an_unspecialized_Foo(); } // This method is NEVER defined to prevent linking. // Its name was chosen to provide a clear explanation why the compilation failed. void cannot_instantiate_an_unspecialized_Foo(); }; template  class Foo { }; template  class Foo { }; 

Так что:

 int main() { Foo foo; } 

Работает, пока:

 int main() { Foo foo; } 

Не.

Очевидно, что цепочка компилятора только жалуется, когда происходит процесс связывания. Но есть ли способ заставить его жаловаться раньше?

Я могу использовать boost .

Просто не определяйте class:

 template  class Foo; template <> class Foo { }; int main(int argc, char *argv[]) { Foo f; // Fine, Foo exists Foo fc; // Error, incomplete type return 0; } 

Почему это работает? Просто потому, что нет никакого общего шаблона. Объявлено, да, но не определено.

Вы просто не можете определить базовый случай:

 template  class Foo; // no definition! template <> class Foo { /* ... */ }; // Foo is OK 

Трюк для C ++ 0x (также доступен с эмуляцией static_assert C ++ 03, но сообщение об ошибке не обязательно лучше, чем оставить основной шаблон неопределенным):

 template struct dependent_false: std::false_type {}; template struct Foo { static_assert( dependent_false::value , "Only specializations of Foo may be used" ); }; 

Утверждение будет действовать только тогда, когда Foo создается с помощью первичного шаблона. Использование static_assert( false, ... ) будет постоянно вызывать утверждение.

  • std :: enable_if: параметр vs template
  • Полезные шаблоны кода Java Eclipse
  • Может ли область переменной Jinja расширяться во внутреннем блоке?
  • Преимущества авто в параметрах шаблона в C ++ 17
  • Специализированная специализированная специализация classа, в которой шаблонный шаблон является шаблоном
  • Проблема GCC: использование члена базового classа, который зависит от аргумента шаблона
  • Являются ли шаблоны C ++ просто маскируемыми?
  • Статическая переменная шаблона
  • Препроцессор C ++: избегать повторения кода списка переменных-членов
  • Шаблоны C ++, неопределенная ссылка
  • Как динамически добавлять RowDefinition или ColumnDefinition в Grid со связыванием?
  • Interesting Posts

    Преобразование строки в строковый массив в java

    Получите IPrincipal от токена носителя OAuth в OWIN

    Экран ноутбука внезапно повернут

    Как включить ведение журнала проводки для java HttpURLConnection трафика?

    Как скопировать Ctrl-p в стрелку вверх с помощью xmodmap?

    Это ошибка в MonoTouch GC?

    IE8 – Не удается добавить сайты в панель избранного

    DialogFragment.getDialog возвращает null

    Как вы узнаете производителя / модель экрана для экрана ноутбука с Linux? (Samsung, LG, Chi Mei и т. Д.)

    документация pinterest api

    LINQ: как выполнить .Max () для свойства всех объектов в коллекции и вернуть объект с максимальным значением

    В каком направлении двигатели селектора читают, точно?

    Почему нет подключенного диска, доступного под расширенным приглашением cmd, но находится под обычной подсказкой cmd?

    Получить первый элемент из итерабельного, который соответствует условию

    Принудительное развертывание обновлений Windows во время презентации

    Давайте будем гением компьютера.