2016-05-14 2 views
1

При чтении документации по boost any и experimental any,
Я не видел никаких упоминаний о type erasure.Имеет ли std :: любое использование стирания типа, субтипирование или полиморфизм?

Я пытаюсь понять концепцию стирания типа, как это применимо к C++.

Правильно ли говорить, что «любой» тип использует стирание типа при хранении его значений?
Правильно ли говорить, что при хранении его значений он использует «полиморфизм»?
Является ли «стирание типа» своего рода «полиморфизмом»?

Статья в Википедии по адресу polymorphism, также не упоминает «стирание типа».
В нем упоминается «подтипирование». Является ли «стирание типа» своего рода «подтипированием»?

Извините, если этот вопрос кажется направленным в разные стороны.

Резюмируя,

Как "типа стирание", "polymorphsim", и "подтипы" относятся к любому типа в C++?

+1

Дополнительная информация: 1) [2 сообщения в блоге] (https://akrzemi1.wordpress.com/2013/11/18/type-erasure-part-i/); 2) [Вопрос переполнения стека] (http://stackoverflow.com/questions/5450159/type-erasure-techniques) –

+0

Полиморфизм на основе наследования можно использовать в качестве метода для реализации стирания стилей. Шон Родитель рассматривает такую ​​технику в разговоре «Наследование - это базовый класс зла». Это не значит, что это единственный вариант. – chris

ответ

0

Правильно ли говорить, что тип «любого» использует «стирание типа» при сохранении его значений?

Может быть, я и другие люди имеют другое определение «типа стирания», но с помощью типа стирания для реализации any не имеет никакого смысла для меня. Если мы используем определение "represent a variety of types through a single generic interface", то any, std::function и т. Д. Соответствуют счету. Определение wikipedia «обеспечение того, что выполнение во время выполнения программы не зависит от информации о типе» не имеет никакого смысла в контексте C++. Generics (архетипический пример стирания типа) не означает «удалить типы из языка». Кроме того, std::any (необязательно) использует RTTI. Поэтому я бы посмотрел в другом месте, кроме википедии.

Правильно ли говорить, что при хранении его значений он использует «полиморфизм»?

Полиморфизм является одним из способов реализации any. Тем не менее, это не требуется. Насколько я могу судить, только Boost использует полиморфизм. См. this answer.

boost

Другие реализации показывают, что это не требуется:

libc++

libstdc++

Также см this и сопровождающие question

Является ли «стирание типа» своего рода «полиморфизмом»?

Нет. Вы рассматриваете шаблоны, дженерики и std::function для всех - полиморфизм?

+0

В контексте C++ «стирание типа» имеет другое значение, чем то, что вы цитируете из Википедии. Например, https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Type_Erasure. – interjay

+0

@interjay Цитата, которую я использовал, на самом деле. Ссылка на Википедию связана с вопросом OP. – user6335390

+0

OK, ссылка OP не имеет отношения к C++. Кстати, реализация Boost использует (динамический) полиморфизм. Просто найдите «виртуальный». И, насколько я вижу, ни одна из реализаций не требует RTTI, кроме как реализовать функцию 'type()'. – interjay

Смежные вопросы