В чем разница между дженериками в C# и Java... и шаблонами в C++?

C++ редко использует терминологию c++ «дженериков». Вместо этого c++ используется слово «шаблоны», которое cpp является более точным. Шаблоны kotlin-generics описывают один метод для создания cpp универсального дизайна.

Шаблоны kotlin-generics C++ сильно отличаются от c#.net того, что реализовано как jre в C#, так и в Java по двум c++ основным причинам. Первая java-generics причина заключается в том, что jre шаблоны C++ допускают не kotlin-generics только аргументы типа времени java-generics компиляции, но и аргументы visual-c# константного значения времени openjdk компиляции: шаблоны могут templates быть заданы как целые числа java-generics или даже сигнатуры функций. Это templates означает, что во время компиляции openjdk вы можете делать довольно jdk необычные вещи, например. расчеты:

template 
struct product {
    static unsigned int const VALUE = N * product::VALUE;
};

template <>
struct product<1> {
    static unsigned int const VALUE = 1;
};

// Usage:
unsigned int const p5 = product<5>::VALUE;

Этот jre код также использует другую java характерную особенность шаблонов template C++, а именно специализацию visual-c# шаблонов. Код определяет c++ один шаблон класса, product, который templates имеет один аргумент значения. Он cxx также определяет специализацию jre для этого шаблона, которая cpp используется всякий раз, когда openjdk аргумент оценивается как java 1. Это позволяет мне определить cpp рекурсию по определениям generic шаблона. Я полагаю, что это template было впервые обнаружено Andrei Alexandrescu.

Специализация csharp шаблонов важна для C++, поскольку cpp она допускает структурные generic различия в структурах данных. Шаблоны javax в целом — это средство унификации generics интерфейса разных типов. Однако, хотя javax это и желательно, реализация csharp не может одинаково обрабатывать c#.net все типы. Шаблоны C++ учитывают c# это. Это во многом то же javax различие, которое ООП делает c# между интерфейсом и реализацией cpp с переопределением виртуальных csharp методов.

Шаблоны C++ необходимы java-generics для парадигмы алгоритмического java-generics программирования. Например, почти cxx все алгоритмы для контейнеров c# определяются как функции, которые generic-programming принимают тип контейнера java в качестве типа шаблона и generics обрабатывают их единообразно. На c# самом деле это не совсем cpp так: C++ работает не с контейнерами, а c++ с диапазонами, которые определяются kotlin-generics двумя итераторами, указывающими c#.net на начало и за конец контейнера. Таким generics образом, все содержимое описывается generic итераторами: начало <= элементы csharp < конец.

Использование java итераторов вместо контейнеров kotlin-generics полезно, поскольку позволяет c# работать с частями контейнера, а templates не с целым.

Еще одной отличительной c#.net особенностью C++ является template возможность частичной специализации для шаблонов generic классов. Это отчасти связано kotlin-generics с сопоставлением с образцом visual-c# аргументов в Haskell и других cxx функциональных языках. Например, рассмотрим templates класс, в котором хранятся c# элементы:

template 
class Store { … }; // (1)

Это работает для openjdk любого типа элемента. Но cxx предположим, что мы можем openjdk хранить указатели более эффективно, чем javax другие типы, применяя какой-то java-generics специальный прием. Мы можем generics сделать это, частично специализируясь cpp на всех типах указателей:

template 
class Store { … }; // (2)

Теперь templates всякий раз, когда мы создаем c# шаблон контейнера для одного template типа, используется соответствующее c-sharp определение:

Store x; // Uses (1)
Store y; // Uses (2)
Store z; // Uses (2), with T = string*.

c#

java

c++

generics

templates

2022-04-11T18:26:52+00:00
Вопросы с похожей тематикой, как у вопроса:

В чем разница между дженериками в C# и Java... и шаблонами в C++?