Тип параметра шаблона базового класса
Имею некий базовый класс:
class bas_class
{
protected:
T data[sizeT];
...
};
Далее, создаю частично специализированного наследника:
class der2_class : public bas_class<T, 2>
{
...
};
typedef der2_class<int> der2int;
Все хорошо, все замечательно. Но, внезапно, требуется сделать следующее:
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. Тут подумал, а инкапсуляция в данном случае не нарушается?
Да хотелось бы при compile-time.
Наследоваться от der_class очень не хочется, т.к. разные операции с der_class и gs2_class планируются. Но в gs2_class много внутренних операций для объектов der_class.
P.S. Может я вообще, не в ту дурь попёр?
Обращение к элементам массива "по псевдонимам"?
По инкапсуляции: подразумевается, что gs2_class предполагает что-то о внутренней структуре своего аргумента шаблона (например, если передать ему в качестве Tc int, то b теряет смысл)
Да, и еще вопросец... Так ли уж нужен шаблон в gs2_class? Или таковое необходимо провернуть не только с der2int?
Обращение к элементам массива "по псевдонимам"?
Да, что-то такого и хочется.
По инкапсуляции: подразумевается, что gs2_class предполагает что-то о внутренней структуре своего аргумента шаблона (например, если передать ему в качестве Tc int, то b теряет смысл)
Ну, вообщем, да. Встроенные типы не будут передаваться. Размер кортежа bas_class - от 2 и далее.
Да, и еще вопросец... Так ли уж нужен шаблон в gs2_class? Или таковое необходимо провернуть не только с der2int?
В том-то и дело. Будет (должны быть) еще der2float, der2double и т.д.
Обобщенно, шаблон генерации типов выглядит так: gs{2,3... n}{int, __int64, ...}
n <= 24 (решение некоторых задач по многомерной геометрии).
class gs2_class
{
union
{
der2_class<T> Tc;
struct
{
T a, b;
};
};
...
}
вариант два:
array[PNAME1] = ...
class gs2_class
{
union
{
[COLOR="Red"] der2_class<T> Tc;[/COLOR]
struct
{
T a, b;
};
};
...
}
Так пробовал. Ошибка С2621, поскольку у der2_class copy constructor имеется. :(
вариант два:
array[PNAME1] = ...
Ну, это у меня вроде параметром sizeT в кортеже разруливается. ;)
P.S. Походу, нашел я себе проблему на пустом месте... :D
class gs2_class
{
Tc ptr;
enum XXX{ a = 0, b};
...
}
и обращение к элементам массива пойдет уже в виде ptr.data[XXX::a]
PS А что за С2621 ?
class gs2_class
{
Tc ptr;
enum XXX{ a = 0, b};
...
}
и обращение к элементам массива пойдет уже в виде ptr.data[XXX::a]
А... щас прикину.
PS А что за С2621 ?
А это вот здесь. Пока в MS VS страдаю.
P.S. Дурной я, по-ходу. Сообщения об ошибках внимательнее читать надо... :o Спасиб всем большой (в репутацию).
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;
Мой гцц это переварил. Всю инкапсуляцию повыкидывал, чтобы не морочиться лишнего (типы у меня простые же).
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;
};
};
};
der2_class имеет конструктор копирования, поэтому в union'е быть не может. А он параметризует gs2_class.
Опять же, С2621.
P.S. Уже справился с траблой. Не так красиво как хотелось бы, но хоть правильно ;) Есть еще несколько задумок, но надо С++09 ждать. Если не обманут.