С++ вопрос

Ответить
Vovka
Уже с Приветом
Сообщения: 1906
Зарегистрирован: Ср мар 14, 2001 4:01 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;
  }
};


Тут уж компилятор просто обязан не инстарциировать данные, к которым не обращались, правильно?

Но оно не подходит по той причине, что время жизни данных желательно ограничить временем жизни класса.

Какие ещё идеи?
Аватара пользователя
adb
Уже с Приветом
Сообщения: 9277
Зарегистрирован: Пт дек 14, 2001 4:01 am
Откуда: Российская Федерация

Re: С++ вопрос

Сообщение adb »

Например, с помощью наследования. Передавать в качестве параметра класс А, в котором нужные поля определены. И соответственно наследовать шаблонный класс от этого класса А. Если параметры не нужны передавать пустой класс A_Null. Виртуальный деструктор в классе А можно не создавать (?).
Mongush
Уже с Приветом
Сообщения: 446
Зарегистрирован: Пт янв 04, 2002 4:01 am
Откуда: Irkutsk->Rockville, MD->Dallas, TX

Сообщение Mongush »

Я не совсем понял вопрос.
В принципе статично это можно сделать, черз шаблоны, но динамично нет. Да и не имеет смысла. Что скажем будет возращатся по sizeof(A).
Vovka
Уже с Приветом
Сообщения: 1906
Зарегистрирован: Ср мар 14, 2001 4:01 am

Re: С++ вопрос

Сообщение Vovka »

adb писал(а):Например, с помощью наследования. Передавать в качестве параметра класс А, в котором нужные поля определены. И соответственно наследовать шаблонный класс от этого класса А. Если параметры не нужны передавать пустой класс A_Null. Виртуальный деструктор в классе А можно не создавать (?).

Не, не подходит. Точнее, не ту проблему решает. Надо не просто создать класс с определённым набором полей, а чтобы из всего множества возможных полей создавались бы только те, которые используются - т.е. те, на которые ссылаются вызываемые ф-ции (ведь если ф-ция не вызывается ниоткуда, то она и не генерится).

Mongush писал(а):Я не совсем понял вопрос.
В принципе статично это можно сделать, черз шаблоны

Статично, как?

Mongush писал(а): Что скажем будет возращатся по sizeof(A).

А вы на чём sizeof вызывать будете? На шаблоне его вызвать нелься, а если A обычный класс, сгенерённый с пом. этого шаблона, то в чём проблема?
Аватара пользователя
adb
Уже с Приветом
Сообщения: 9277
Зарегистрирован: Пт дек 14, 2001 4:01 am
Откуда: Российская Федерация

Re: С++ вопрос

Сообщение adb »

Vovka писал(а):Не, не подходит. Точнее, не ту проблему решает. Надо не просто создать класс с определённым набором полей, а чтобы из всего множества возможных полей создавались бы только те, которые используются - т.е. те, на которые ссылаются вызываемые ф-ции (ведь если ф-ция не вызывается ниоткуда, то она и не генерится).


Ну можно каждый параметр обернуть умным указателем. И во время первого обращения создавать реальный объект. Или вообще использовать классику - синглтон. Вообщем что-нибудь в это духе. А зачем вообще это нужно?
Vovka
Уже с Приветом
Сообщения: 1906
Зарегистрирован: Ср мар 14, 2001 4:01 am

Re: С++ вопрос

Сообщение Vovka »

adb писал(а):Ну можно каждый параметр обернуть умным указателем. И во время первого обращения создавать реальный объект. Или вообще использовать классику - синглтон. Вообщем что-нибудь в это духе. А зачем вообще это нужно?


Ну, там в-общем то и есть эти самые указатели. Только представьте себе такого жлоба, которому даже 4 байт жалко. :mrgreen:

На самом деле, вопрос отныне представляет чисто академический интерес, я решил вообще другим путём пойти.
Mongush
Уже с Приветом
Сообщения: 446
Зарегистрирован: Пт янв 04, 2002 4:01 am
Откуда: Irkutsk->Rockville, MD->Dallas, TX

Re: С++ вопрос

Сообщение Mongush »

Vovka писал(а):
Mongush писал(а):Я не совсем понял вопрос.
В принципе статично это можно сделать, черз шаблоны

Статично, как?

В смысле все определится в момент компиляции, ну как всегда происходит с шаблонами.
Vovka писал(а):
Mongush писал(а): Что скажем будет возращатся по sizeof(A).

А вы на чём sizeof вызывать будете? На шаблоне его вызвать нелься, а если A обычный класс, сгенерённый с пом. этого шаблона, то в чём проблема?

Почему нельзя? Ведь во время исполнения никаких шаблонов уже и нет.
Vovka
Уже с Приветом
Сообщения: 1906
Зарегистрирован: Ср мар 14, 2001 4:01 am

Re: С++ вопрос

Сообщение Vovka »

Mongush писал(а):
Vovka писал(а):Статично, как?

В смысле все определится в момент компиляции, ну как всегда происходит с шаблонами.

Блин, казнить-нельзя-помиловать, я ж там запятую поставил. :)
Нужно статично, как сделать?

Mongush писал(а):
Vovka писал(а):На шаблоне его вызвать нелься, а если A обычный класс, сгенерённый с пом. этого шаблона, то в чём проблема?

Почему нельзя? Ведь во время исполнения никаких шаблонов уже и нет.

Я в том смысле, что если есть template <class T> struct S{}, то можно вызвать sizeof(S<int>), но нельзя sizeof(S).
Ответить

Вернуться в «Вопросы и новости IT»