Что означает «отложенная инстанция» в шаблонах на C++?C++ шаблон «отложенная инстанция»
ответ
Отложенная инстанция - это когда шаблон не создается до тех пор, пока соответствующий объект не будет использоваться в первый раз. Например, у вас есть шаблонные функции:
template<int Size>
void YourFunction()
{
//does something
}
параметр Size
может иметь любое возможное значение, которое может иметь int
. Вы автоматически используете запрограммированную функцию для всех возможных значений Size
? Нет, шаблон обрабатывается только для значений, которые фактически используются в качестве параметра при вызове функции сначала появляется в коде:
YourFunction<100>(); //instantiated for 100
Я только слышал, как люди используют термин «отложенная реализацию» для обозначения ситуация, при которой определение члена класса конкретизируется только тогда, когда он используется
template<typename T>
struct A {
void f() {
T a; // invalid if T is void
}
};
A<void> a; // valid!
в этом случае A<void>
неявно экземпляр, потому что компилятор должен знать свой размер (формально, тип класса должен быть полным, так конкретизацией срабатывает). Но описание его определений : отложено, пока они фактически не используются. Это относится не только к функциям-членов, но и статическим членам данных и вложенным классам
struct Print {
Print() { std::cout << "hello!"; }
};
template<typename T>
struct A {
static Print print;
};
template<typename T>
Print A<T>::print;
Теперь, даже если вы неявно инстанцируете A<T>
сообщение не будет распечатаны, пока вы явно не относитесь к A<T>::print
и использованию его , Явная конкретизация не уступают экземпляры определений членов - так что следующие всегда напечатает сообщение
template struct A<void>;
Существует трюк, чтобы вызвать инстанцирование определений членов для неявных конкретизации хотя: Обратитесь к ним в декларации частях класса 'член, как в следующем шаблоне измененного класса
template<typename T, T&> struct useit { };
template<typename T>
struct A {
static Print print;
typedef useit<Print, print> useit_type;
};
Теперь, если A<T>
неявно конкретизируется сообщение выводится, поскольку декларация ЬурейеЙ относится к нему.
- 1. Динамическая инстанция в C++
- 2. Правильная инстанция UISearchDisplayController
- 3. Динамическая инстанция в php
- 4. Отложенная отправка?
- 5. Отложенная инициализация - Hibernate
- 6. C# отложенная оценка и возвращаемые значения
- 7. Linq и отложенная оценка
- 8. Инстанция webservice на VS 2012 для WP7
- 9. Отложенная загрузка и пользовательский рендеринг
- 10. Отложенная работа не работает
- 11. Отложенная привязка для обещаний
- 12. Отложенная позиция рендеринга
- 13. Twisted Producer отложенная запись
- 14. Dojo Отложенная цепочка
- 15. OpenGL Отложенная рендеринг статична?
- 16. Отложенная инициализация неизменяемых переменных
- 17. отложенная рендеринга opengl blend
- 18. отложенная работа и monit
- 19. отложенная скорая выплата
- 20. Отложенная печать на Java
- 21. отложенная проверка ограничений
- 22. Отложенная оценка в Clojure
- 23. Отложенная иерархическая структура таблицы
- 24. Отложенная цепочка сбойного браузера
- 25. JQuery Отложенная функция async
- 26. gwt отложенная отладка планирования
- 27. Простая jquery отложенная очередь
- 28. Отложенная функция в PHP
- 29. функция и отложенная jquery
- 30. EntityFramework и отложенная загрузка
+1. Мне нравится ожидание, которое вы добавляете, задавая вопросы ;-) –
Причина, по которой это важно: представить строку 'const int number = 100/Size;'. Он не должен генерировать ошибку, пока кто-то не попытается использовать 'YourFunction <0>'. – MSalters
@MSalters: Да, это тоже. Но представьте себе, что компилятор попытается создать экземпляр этой функции для любого возможного значения 'int' - это будет много промежуточных данных. – sharptooth