2010-09-08 3 views

ответ

9

Отложенная инстанция - это когда шаблон не создается до тех пор, пока соответствующий объект не будет использоваться в первый раз. Например, у вас есть шаблонные функции:

template<int Size> 
void YourFunction() 
{ 
    //does something 
} 

параметр Size может иметь любое возможное значение, которое может иметь int. Вы автоматически используете запрограммированную функцию для всех возможных значений Size? Нет, шаблон обрабатывается только для значений, которые фактически используются в качестве параметра при вызове функции сначала появляется в коде:

YourFunction<100>(); //instantiated for 100 
+1

+1. Мне нравится ожидание, которое вы добавляете, задавая вопросы ;-) –

+0

Причина, по которой это важно: представить строку 'const int number = 100/Size;'. Он не должен генерировать ошибку, пока кто-то не попытается использовать 'YourFunction <0>'. – MSalters

+0

@MSalters: Да, это тоже. Но представьте себе, что компилятор попытается создать экземпляр этой функции для любого возможного значения 'int' - это будет много промежуточных данных. – sharptooth

2

Я только слышал, как люди используют термин «отложенная реализацию» для обозначения ситуация, при которой определение члена класса конкретизируется только тогда, когда он используется

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> неявно конкретизируется сообщение выводится, поскольку декларация ЬурейеЙ относится к нему.

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