1. Линкер не выкидывает данные из классов (в отличие от ф-ций), даже если на них нет ссылок.
2. С шаблонами - та же история, если я напишу, например:
Code: Select all
template <class Foo>
struct A
{
Srv1Ptr m_srv1;
Srv2Ptr m_srv2;
};
И не разу не обращусь к m_srv2, например, то эта переменная всё равно создастся.
Верно?
Теперь проблема. Надо написать шаблон, в котором данные инстарциируются только тогда, когда они нужны.
Сначала мне пришло в голову такое решение:
Code: Select all
template <class Foo>
struct A
{
Srv1Ptr& Srv1()
{
static Srv1Ptr ret;
return ret;
}
Srv2Ptr& Srv2()
{
static Srv2Ptr ret;
return ret;
}
};
Тут уж компилятор просто обязан не инстарциировать данные, к которым не обращались, правильно?
Но оно не подходит по той причине, что время жизни данных желательно ограничить временем жизни класса.
Какие ещё идеи?