С++ вопрос

Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

С++ вопрос

Post by Vovka »

Сначала хотелось бы удостовериться в исходных предпосылках.
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;
  }
};


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

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

Какие ещё идеи?
User avatar
adb
Уже с Приветом
Posts: 9275
Joined: 14 Dec 2001 10:01
Location: Российская Федерация

Re: С++ вопрос

Post by adb »

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

Post by Mongush »

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

Re: С++ вопрос

Post by Vovka »

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

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

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

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

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

А вы на чём sizeof вызывать будете? На шаблоне его вызвать нелься, а если A обычный класс, сгенерённый с пом. этого шаблона, то в чём проблема?
User avatar
adb
Уже с Приветом
Posts: 9275
Joined: 14 Dec 2001 10:01
Location: Российская Федерация

Re: С++ вопрос

Post by adb »

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


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

Re: С++ вопрос

Post by Vovka »

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


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

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

Re: С++ вопрос

Post by Mongush »

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

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

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

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

Почему нельзя? Ведь во время исполнения никаких шаблонов уже и нет.
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Re: С++ вопрос

Post by Vovka »

Mongush wrote:
Vovka wrote:Статично, как?

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

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

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

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

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

Return to “Вопросы и новости IT”