Мне интересно, как работают функции члена шаблона. В частности, когда создается экземпляр функции-члена шаблона, переопределяется весь класс? Моя путаница исходит из того, что (если я прав) классы шаблонов не являются классами в собственном смысле. то есть при создании экземпляра компилятор создает определение для совершенно нового класса. То же самое для функций шаблона. Однако классы с функцией шаблона кажутся действительными классами, поэтому я не уверен, как они могут работать. Таким образом, мне интересно, после создания экземпляра функции-члена шаблона, что происходит с определением класса? Более того, если я передаю класс с функцией члена шаблона в класс шаблона, могу ли я использовать функцию члена шаблона? Может ли это вызвать проблему? Я попробовал это один раз, но получил ошибку, заявив, что несколько функций, где определено больше, чем когда-то, хотя я не уверен, что это была причина, или может быть другая причина моей ошибки. Есть ли еще одна оговорка при использовании статических функций-членов шаблона?Как работают функции члена шаблона в C++?
ответ
Определение класса остается таким, каким оно есть; вся эта функция шаблона генерирует семейство функций-членов для этого класса. В качестве примера:
class A {
public:
template<typename T> foo (T &t);
}
не является концептуально отличается от вас писать:
class A {
public:
foo (bool &t);
foo (int &t);
foo (double &t);
}
... просто удобнее. И в последнем примере вы не ожидали, что новый класс будет создан для каждой функции?
Возможно, путаница возникает из-за того, что функции являются частью структуры памяти класса; что каждая функция сама содержится в классе и будет создаваться где-то в памяти всякий раз, когда создается объект класса. Это понятие неверно. Функции (templated, global, member, lambda или other) никогда не создаются «на лету» или не копируются в памяти; они представляют собой статическую и неизменную часть исполняемого изображения. Макет памяти класса не изменяется из-за наличия дополнительного набора функций, даже если они генерируются членом шаблона.
Похоже, что в этом примере отсутствуют сильные понятия ввода текста. Использование шаблонов с типами создает новые типы, где ваш 'foo' может иметь' A * x = new A (true); 'или' A * y = new A (123); 'с' x' и 'y' заканчивается как тот же тип – infixed
@infixed 'foo' не является конструктором, поэтому ваш примерный код не применяется. Вопрос в частности касается не-шаблонных классов с функцией-членом шаблона. Никаких новых типов не создается. –
Определение класса шаблона создается при создании экземпляра класса. Каждая функция-член создается при использовании. Это фактически позволяет вам иметь функции-члены, которые не будут работать, если они вызываются при создании экземпляра класса с некоторыми типами, а не с другими. Тем не менее, вы должны убедиться, что подписи функции либо синтаксически жизнеспособны, либо не работают с SFINAE. Он будет рассмотрен во время первого этапа разбора. Тело, если функция не является самим шаблоном, будет проверяться на поиск имени ... поэтому зависимые имена должны быть помечены как таковые через typename.
Я не думаю, что это совершенно верно.Нет такой вещи, как «определение класса шаблона». Существует определение * класса шаблона *, но это никогда не создается. Создаются только * специализации * шаблона. Более того, специализация не создается каждый раз, когда она используется, но только в первый раз, когда она используется (внутри каждой единицы перевода). –
- 1. Специализация функции-члена класса шаблона в C++
- 2. C++ Прямой вызов функции-члена без шаблона для функции шаблона
- 3. Инстанцирование функции члена шаблона
- 4. Вызов функции-члена шаблона внутри функции-члена шаблона
- 5. шаблона функции члена специализации
- 6. Наследование класса шаблона с помощью функции члена-шаблона в C++
- 7. Использование шаблона C++ с указателем функции-члена
- 8. перегрузка функции-члена класса шаблона
- 9. Специализация функции члена шаблона класса шаблона?
- 10. Экспедиторские аргументы функции члена шаблона
- 11. типа задающий члена класса в функции шаблона
- 12. специализация функции члена шаблона класса
- 13. Как специализировать функции члена шаблона в классе шаблона (уже задано)?
- 14. Как специализировать функции члена шаблона в классе шаблона?
- 15. Объект возврата шаблона в функции члена шаблона класса шаблона
- 16. Выбор шаблона функции члена и SFINAE
- 17. C++: переопределение функции члена шаблона в родительском классе
- 18. скрытия параметра шаблона шаблона члена
- 19. Несоответствие типа/значение в функции члена C++ шаблона класса
- 20. C++ вывести параметры функции члена
- 21. Частичная специализация функции члена вариационного шаблона
- 22. Значение параметра шаблона аргумента функции-члена
- 23. Наследование шаблона Variadic, перегрузка функции-члена
- 24. определение концепции требует стесненном функции-члена шаблона:
- 25. Приобретите тип функции для члена шаблона класса?
- 26. C++ Определить тип члена функции шаблона указателя постоянной
- 27. Передача функции-члена как обратного вызова функции шаблона
- 28. Передача функции-члена (нестатическая) как параметр функции шаблона
- 29. Специализация функции члена шаблона C++, основанная на значении параметра
- 30. Sencha architect использует функции члена шаблона?
Специализируется на шаблоне, будь то шаблон шаблона или шаблон функции, создается при первом использовании в единицах перевода. Классы могут иметь шаблоны участников (как шаблоны классов, так и функции), а также шаблоны классов. Более того, функции-члены шаблонов классов сами по себе неявно функционируют шаблоны. –
Обратите внимание, что шаблон никогда не создается. Могут быть созданы только * специализации * шаблона. –
Хорошо, спасибо. –