Comments 16
Всё-таки иногда не хватает мощности констрейнтов генериков в сишарпе, хотелось бы на Enum (хотя clr поддерживает такое), Числа, операции +\- и т.д.
Универсальные шаблоны – они же generics
Первая фраза и тут же обрадовали :) Шаблоны != Generics, об этом говориться в официальной документации даже:
blogs.msdn.com/b/ericlippert/archive/2009/07/30/generics-are-not-templates.aspx
msdn.microsoft.com/en-us/library/vstudio/sbh15dya.aspx
Вы не правильно поняли контекст предложения, более того — официальный русский перевод слова generics — Универсальные шаблоны
А насчет, того что generics != templates, то шаблоны в C++ — это макросы, «выглядящие» как классы, а generics — это параметричесике типы.
А насчет, того что generics != templates, то шаблоны в C++ — это макросы, «выглядящие» как классы, а generics — это параметричесике типы.
Всегда считал, что официальный перевод (according to msdn) — Обобщения.
Ок, не совсем прав.
Ок, не совсем прав.
Не нашёл выше по ссылке
Зато указанная статья встречает плашкой:
Да и дилетантский способ проверить популярность того или иного термина показывает:
c# обобщения — 222 тыс. результатов;
c# универсальные шаблоны — 6,5 тыс. результатов.
официальный русский перевод слова generics
Зато указанная статья встречает плашкой:
Данная статья переведена автоматически. Наведите указатель мыши на предложения статьи, чтобы просмотреть исходный текст. Дополнительные сведения.
Да и дилетантский способ проверить популярность того или иного термина показывает:
c# обобщения — 222 тыс. результатов;
c# универсальные шаблоны — 6,5 тыс. результатов.
Шаблоны в С++ — это не макросы. Хотя бы потому, что они реализуют полный по тьюрингу чистый функциональный язык оперирующий с типами.
ну это ни в коем случае не доказывает обратное.
более того, я писал:
>>это макросы, «выглядящие» как классы
какую абстракцию иметь ввиду, дело другое
более того, я писал:
>>это макросы, «выглядящие» как классы
какую абстракцию иметь ввиду, дело другое
Если бы это были макросы, то шаблоны можно было бы «раскрыть» преобразовав программу к семантически эквивалентному виду, но без макросов. Однако в общем случае это невозможно, потому что в С++ есть SFINAE.
Например, у вас никак не получится реализовать на макросах вот такой код:
Вы просто не сможете определить какую перегрузку выбрать, т.к. используя только макросы вы не сможете определить, является ли тип Т pod-типом — для этого нужен полноценный компилятор. И это только частный случай :)
Например, у вас никак не получится реализовать на макросах вот такой код:
#include <type_traits>
#include <iostream>
#include <string>
struct NonPod { virtual ~NonPod() {} };
struct Pod {};
struct classifier
{
template<class T>
static std::string classify(T &&rr, ...)
{
return "Classified as non POD";
}
template<class T>
static std::string classify(T &&rr, typename std::enable_if<std::is_pod<T>::value>::type * = 0)
{
return "Classified as POD";
}
};
void main()
{
std::cout << classifier::classify(NonPod()) << std::endl; // prints "Classified as non POD"
std::cout << classifier::classify(Pod()) << std::endl; // prints "Classified as POD"
}
Вы просто не сможете определить какую перегрузку выбрать, т.к. используя только макросы вы не сможете определить, является ли тип Т pod-типом — для этого нужен полноценный компилятор. И это только частный случай :)
Я что-то не понял зачем в Double Dispatch примере интерфейсы, ведь через них пользоваться этим кодом не получится. Может я чего-то не понимаю…
интерфейсы лишь заменяют базовый класс Thing как в примере с Multiple dispatch. не более чем абстракция.
В данном случае, они по-моему только мешают, потому что если переписать main вот так:
Что просится глядя на определения классов, код становится не рабочим.
ICollidable asteroid = new Asteroid();
ICollidable spaceship = new Spaceship();
Что просится глядя на определения классов, код становится не рабочим.
А есть конкретный пример системы, где это можно было бы применить?
Sign up to leave a comment.
The art of Generics