Вы можете ограничить диапазон параметров шаблона в C ++, используя различные механизмы черт, из которых есть реализации, доступные в boost.
Обычно это не так. Причина, по которой синтаксис существует в Java и C #, заключается в том, что они используют шаблоны, а не шаблоны.
Обобщения Java генерируют общий код, который использует виртуальную диспетчеризацию из базового типа, а не генерирует код для каждого типа, используемого в качестве аргумента шаблона. Поэтому обычно вы используете ограничение, чтобы позволить вам вызывать методы для объектов типа, используемого в качестве параметра шаблона.
Поскольку C ++ генерирует код для каждого типа, используемого в качестве параметра шаблона, ему не нужно знать о базовом типе для них.
Например, шаблонный класс для матрицы будет использовать операторы +, -, * для своего целевого типа. Затем может использоваться для любого типа, который поддерживает эти операторы. Если он был произвольно ограничен double
с и int
с, то вы не могли бы использовать шаблон с complex<double>
или запустить тест с типом, который поддерживает интервальную арифметику, даже если эти типы предоставляют эти операторы, и библиотека матриц будет действительна при их использовании.
Способность работать с произвольными типами, которые имеют одинаковую форму, является силой шаблонов и делает их более полезными. Клиентский код должен решить, допустимо ли использовать этот шаблон с этим типом (пока он компилируется), и клиент всегда прав. Невозможность работать с произвольными типами, имеющими одинаковую форму, и требование указывать ограничения для вызова методов, отличных от java.lang.Object
, является слабостью обобщений.