Я понимаю аспекты шаблонов в С++, которые отличаются от дженериков в Java и С#. С# - это reification, Java использует стирание типов, С++ использует утиную печать и т.д. Существует множество вещей, которые могут создавать шаблоны С++, которые не могут использовать Java и С# generics (например, специализация шаблона). Но есть нескольких вещей, которые генерируют дженерики Java, которые С# и С++ не могут (например, создать параметр ограниченного типа семейства дженериков типа ряд вещей, которые генерируют С# может сделать то, что Java и С++ не могут (например, общее представление времени исполнения). [EDIT: По-видимому, Java-дженерики намного слабее, чем я думал. (Что-то говорит.) В любом случае, несмотря на их неумелость, они по-прежнему считаются дженериками вместе с генераторами С#.]class Foo<T extends Comparable<?>>
) и
Я не понимаю, что концептуально делает шаблоны отличными от дженериков. Какие части шаблонов на С++ - это вещи, которые нельзя сделать в том, что не является шаблоном, но является общим? Например, если бы я должен был реализовать язык, поддерживающий шаблоны, что бы в нем было необходимо? Что я мог бы оставить в стороне, что было бы необходимо, чтобы язык поддерживал дженерики?
Я предполагаю, что шаблоны - это супер-набор дженериков, или они являются способом реализации дженериков, но я действительно не понимаю, что отделяет истинный шаблон от истинного общего.