Вопрос

Можно ли написать нечистый шаблон на C++?То есть шаблон, который иногда дает другой результирующий тип или целое число для одних и тех же параметров шаблона.Например, можно ли написать шаблон Foo<T> где Foo<int>::type иногда бывает char и в другое время float?Или шаблон Foo<T> где Foo<double>::my_static_const_int иногда 10, а иногда 20?

Это было полезно?

Решение

Это невозможно.Если у вас есть шаблон, который ведет себя таким образом, он нарушает ODR и/или другие правила, например, что специализация должна быть объявлена ​​до ее создания.Таким образом, вы не можете просто указать специализацию, которая каким-то образом изменила бы элемент typedef, чтобы он разрешался в другой тип для всех последующих ссылок.

Помните, что Foo<T> ссылается на класс, если Foo это шаблон класса.Если член typedef класса определен как один тип в одном месте программы, а другой тип в другом месте, значит, что-то пошло не так.Вот различные стандартные цитаты, касающиеся этого вопроса.


Специализация для шаблона функции, шаблона функции-члена или функции-члена или статического члена данных шаблона класса может иметь несколько точек реализации в единице перевода.Специализация шаблона класса имеет не более одной точки реализации в единице перевода.Специализация для любого шаблона может иметь точки реализации в нескольких единицах перевода.Если две разные точки реализации придают специализации шаблона разные значения в соответствии с правилом одного определения (3.2), программа является неправильной и никакой диагностики не требуется.


Если шаблон, шаблон члена или член шаблона класса явно специализированы, то эта специализация должна быть объявлена ​​перед первым использованием этой специализации, которое приведет к неявному созданию экземпляра, в каждой единице перевода, в которой происходит такое использование. ;никакой диагностики не требуется.


(различные "шумы" пропускаются)

[..Различные объекты, которых можно определить несколько во всей программе..].Учитывая, что такая сущность с именем D определена более чем в одной единице перевода, тогда

  • каждое определение D должно состоять из одной и той же последовательности токенов;
  • в каждом определении D соответствующие имена, найденные в соответствии с 3.4, должны ссылаться на объект, определенный в определении D, или должны ссылаться на один и тот же объект после разрешения перегрузки (13.3) и после сопоставления частичной специализации шаблона (14.8). .3)...
  • Если D - шаблон, и определяется в более чем одной единице перевода, то последние четыре требования из приведенного выше списка должны применяться к именам из приоритета шаблона, используемого в определении шаблона (14.6.3), а также к зависимым именам в точке экземпляра (14.6.2).Если определения D удовлетворяют всем этим требованиям, то программа должна вести себя так, как если бы существовало одно определение D.Если определения D не удовлетворяют этим требованиям, то поведение не определено.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top