Страница 1 из 1
С++ вопрос
Добавлено: Чт сен 18, 2003 3:10 am
Vovka
Сначала хотелось бы удостовериться в исходных предпосылках.
1. Линкер не выкидывает данные из классов (в отличие от ф-ций), даже если на них нет ссылок.
2. С шаблонами - та же история, если я напишу, например:
Код: Выделить всё
template <class Foo>
struct A
{
Srv1Ptr m_srv1;
Srv2Ptr m_srv2;
};
И не разу не обращусь к m_srv2, например, то эта переменная всё равно создастся.
Верно?
Теперь проблема. Надо написать шаблон, в котором данные инстарциируются только тогда, когда они нужны.
Сначала мне пришло в голову такое решение:
Код: Выделить всё
template <class Foo>
struct A
{
Srv1Ptr& Srv1()
{
static Srv1Ptr ret;
return ret;
}
Srv2Ptr& Srv2()
{
static Srv2Ptr ret;
return ret;
}
};
Тут уж компилятор просто обязан не инстарциировать данные, к которым не обращались, правильно?
Но оно не подходит по той причине, что время жизни данных желательно ограничить временем жизни класса.
Какие ещё идеи?
Re: С++ вопрос
Добавлено: Чт сен 18, 2003 8:28 am
adb
Например, с помощью наследования. Передавать в качестве параметра класс А, в котором нужные поля определены. И соответственно наследовать шаблонный класс от этого класса А. Если параметры не нужны передавать пустой класс A_Null. Виртуальный деструктор в классе А можно не создавать (?).
Добавлено: Чт сен 18, 2003 9:51 am
Mongush
Я не совсем понял вопрос.
В принципе статично это можно сделать, черз шаблоны, но динамично нет. Да и не имеет смысла. Что скажем будет возращатся по sizeof(A).
Re: С++ вопрос
Добавлено: Чт сен 18, 2003 10:54 am
Vovka
adb писал(а):Например, с помощью наследования. Передавать в качестве параметра класс А, в котором нужные поля определены. И соответственно наследовать шаблонный класс от этого класса А. Если параметры не нужны передавать пустой класс A_Null. Виртуальный деструктор в классе А можно не создавать (?).
Не, не подходит. Точнее, не ту проблему решает. Надо не просто создать класс с определённым набором полей, а чтобы из всего множества возможных полей создавались бы только те, которые используются - т.е. те, на которые ссылаются вызываемые ф-ции (ведь если ф-ция не вызывается ниоткуда, то она и не генерится).
Mongush писал(а):Я не совсем понял вопрос.
В принципе статично это можно сделать, черз шаблоны
Статично, как?
Mongush писал(а): Что скажем будет возращатся по sizeof(A).
А вы на чём sizeof вызывать будете? На шаблоне его вызвать нелься, а если A обычный класс, сгенерённый с пом. этого шаблона, то в чём проблема?
Re: С++ вопрос
Добавлено: Чт сен 18, 2003 11:24 am
adb
Vovka писал(а):Не, не подходит. Точнее, не ту проблему решает. Надо не просто создать класс с определённым набором полей, а чтобы из всего множества возможных полей создавались бы только те, которые используются - т.е. те, на которые ссылаются вызываемые ф-ции (ведь если ф-ция не вызывается ниоткуда, то она и не генерится).
Ну можно каждый параметр обернуть умным указателем. И во время первого обращения создавать реальный объект. Или вообще использовать классику - синглтон. Вообщем что-нибудь в это духе. А зачем вообще это нужно?
Re: С++ вопрос
Добавлено: Чт сен 18, 2003 12:05 pm
Vovka
adb писал(а):Ну можно каждый параметр обернуть умным указателем. И во время первого обращения создавать реальный объект. Или вообще использовать классику - синглтон. Вообщем что-нибудь в это духе. А зачем вообще это нужно?
Ну, там в-общем то и есть эти самые указатели. Только представьте себе такого жлоба, которому даже 4 байт жалко.
На самом деле, вопрос отныне представляет чисто академический интерес, я решил вообще другим путём пойти.
Re: С++ вопрос
Добавлено: Чт сен 18, 2003 12:08 pm
Mongush
Vovka писал(а):Mongush писал(а):Я не совсем понял вопрос.
В принципе статично это можно сделать, черз шаблоны
Статично, как?
В смысле все определится в момент компиляции, ну как всегда происходит с шаблонами.
Vovka писал(а):Mongush писал(а): Что скажем будет возращатся по sizeof(A).
А вы на чём sizeof вызывать будете? На шаблоне его вызвать нелься, а если A обычный класс, сгенерённый с пом. этого шаблона, то в чём проблема?
Почему нельзя? Ведь во время исполнения никаких шаблонов уже и нет.
Re: С++ вопрос
Добавлено: Пт сен 19, 2003 3:09 am
Vovka
Mongush писал(а):Vovka писал(а):Статично, как?
В смысле все определится в момент компиляции, ну как всегда происходит с шаблонами.
Блин, казнить-нельзя-помиловать, я ж там запятую поставил.
Нужно статично, как сделать?
Mongush писал(а): Vovka писал(а):На шаблоне его вызвать нелься, а если A обычный класс, сгенерённый с пом. этого шаблона, то в чём проблема?
Почему нельзя? Ведь во время исполнения никаких шаблонов уже и нет.
Я в том смысле, что если есть template <class T> struct S{}, то можно вызвать sizeof(S<int>), но нельзя sizeof(S).