Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Тип параметра шаблона базового класса

9
17 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Обнаруживаю постыдно чудовищное незнание механизма шаблонов в С++.

Имею некий базовый класс:
 
Код:
template <typename T, size_t sizeT>
class bas_class
{
protected:
    T data[sizeT];
...
};

Далее, создаю частично специализированного наследника:
 
Код:
template <typename T>
class der2_class : public bas_class<T, 2>
{
...
};

typedef der2_class<int> der2int;



Все хорошо, все замечательно. Но, внезапно, требуется сделать следующее:
Код:
template <typename Tc>
class gs2_class
{
    union
    {
        Tc ptr;

        struct
        {
            // в этой спецухе, тут должон быть int
            [COLOR="Red"]???[/COLOR] a, b;
        };
    };
...
}

typedef gs2_class<der2int> gs2int;

Собственно вопрос: возможно ли узнать тип [FONT="Courier New"]bas_class[/FONT], без введения дополнительных параметров шаблону [FONT="Courier New"]gs2_class[/FONT]? Вроде так. (Кстати, это только вариант. Если есть другие идеи - буду безмерно.)

P.S. Стандарт курил (расплывчато, не нашел или не увидел), гугля курил (много голых женщин видел). Что и где еще покурить (пока не напился)?

P.P.S. Тут подумал, а инкапсуляция в данном случае не нарушается?
11
17 августа 2009 года
oxotnik333
2.9K / / 03.08.2007
typeid не спасет?
9
17 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: oxotnik333
typeid не спасет?


Да хотелось бы при compile-time.
Наследоваться от der_class очень не хочется, т.к. разные операции с der_class и gs2_class планируются. Но в gs2_class много внутренних операций для объектов der_class.

P.S. Может я вообще, не в ту дурь попёр?

535
17 августа 2009 года
Нездешний
537 / / 17.01.2008
А какова цель объединения в gs2_class?
Обращение к элементам массива "по псевдонимам"?

По инкапсуляции: подразумевается, что gs2_class предполагает что-то о внутренней структуре своего аргумента шаблона (например, если передать ему в качестве Tc int, то b теряет смысл)

Да, и еще вопросец... Так ли уж нужен шаблон в gs2_class? Или таковое необходимо провернуть не только с der2int?
9
17 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Нездешний
А какова цель объединения в gs2_class?
Обращение к элементам массива "по псевдонимам"?


Да, что-то такого и хочется.

Цитата: Нездешний

По инкапсуляции: подразумевается, что gs2_class предполагает что-то о внутренней структуре своего аргумента шаблона (например, если передать ему в качестве Tc int, то b теряет смысл)


Ну, вообщем, да. Встроенные типы не будут передаваться. Размер кортежа bas_class - от 2 и далее.

Цитата: Нездешний

Да, и еще вопросец... Так ли уж нужен шаблон в gs2_class? Или таковое необходимо провернуть не только с der2int?


В том-то и дело. Будет (должны быть) еще der2float, der2double и т.д.

Обобщенно, шаблон генерации типов выглядит так: gs{2,3... n}{int, __int64, ...}
n <= 24 (решение некоторых задач по многомерной геометрии).

535
17 августа 2009 года
Нездешний
537 / / 17.01.2008
вариант раз
Код:
template <typename T>
class gs2_class
{
    union
    {
        der2_class<T> Tc;

        struct
        {
            T a, b;
        };
    };
...
}

вариант два:
 
Код:
enum PSEUDONAMES {PNAME1 = 0, PNAME2, ...};
array[PNAME1] = ...
9
17 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Нездешний
вариант раз
Код:
template <typename T>
class gs2_class
{
    union
    {
[COLOR="Red"]        der2_class<T> Tc;[/COLOR]

        struct
        {
            T a, b;
        };
    };
...
}


Так пробовал. Ошибка С2621, поскольку у der2_class copy constructor имеется. :(

Цитата: Нездешний

вариант два:
 
Код:
enum PSEUDONAMES {PNAME1 = 0, PNAME2, ...};
array[PNAME1] = ...


Ну, это у меня вроде параметром sizeT в кортеже разруливается. ;)

P.S. Походу, нашел я себе проблему на пустом месте... :D

535
17 августа 2009 года
Нездешний
537 / / 17.01.2008
Не, это не про SizeT. Это вот про что:
 
Код:
template <typename Tc>
class gs2_class
{
    Tc ptr;
    enum XXX{ a = 0, b};
    ...
}


и обращение к элементам массива пойдет уже в виде ptr.data[XXX::a]

PS А что за С2621 ?
9
17 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Нездешний
Не, это не про SizeT. Это вот про что:
 
Код:
template <typename Tc>
class gs2_class
{
    Tc ptr;
    enum XXX{ a = 0, b};
    ...
}


и обращение к элементам массива пойдет уже в виде ptr.data[XXX::a]


А... щас прикину.

Цитата: Нездешний

PS А что за С2621 ?


А это вот здесь. Пока в MS VS страдаю.

P.S. Дурной я, по-ходу. Сообщения об ошибках внимательнее читать надо... :o Спасиб всем большой (в репутацию).

87
17 августа 2009 года
Kogrom
2.7K / / 02.02.2008
Ну и для кучи упрощенный вариант 1 от Нездешнего:

Код:
template <typename T, size_t sizeT>
struct bas_class
{
    T data[sizeT];
};

template <typename T>
struct der2_class : public bas_class<T, 2>
{
};

typedef der2_class<int> der2int;

template <typename T>
struct gs2_class
{
    der2_class<T> ptr;
    // в этой спецухе, тут должон быть int
    T &a;
    T &b;
    gs2_class(): a(ptr.data[0]), b(ptr.data[1]) {}
};

typedef gs2_class<int> gs2int;

Мой гцц это переварил. Всю инкапсуляцию повыкидывал, чтобы не морочиться лишнего (типы у меня простые же).
505
21 августа 2009 года
vAC
343 / / 28.02.2006
Так не сойдет?

Код:
template <typename T, size_t sizeT>
class bas_class
{
public:
  typedef T type;
protected:
    T data[sizeT];
};
...
 
template <typename Tc>
class gs2_class
{
    union
    {
        Tc ptr;
        struct
        {
            // в этой спецухе, тут должон быть int
          typename Tc::type a, b;
        };
    };
};
9
22 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Нет, к сожалению.
der2_class имеет конструктор копирования, поэтому в union'е быть не может. А он параметризует gs2_class.
Опять же, С2621.

P.S. Уже справился с траблой. Не так красиво как хотелось бы, но хоть правильно ;) Есть еще несколько задумок, но надо С++09 ждать. Если не обманут.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог