Шаблоны
CHashTable. При его инициализации ему передается какаято структура, в моем случае
struct CPeopIdx0
{
char Data[20];
int NumRec;
};
Поля в структуре одни и те же, но могут менятся типы полей, например я могу передать
struct CPeopIdx1
{
BYTE Data[20];
int NumRec;
};
А суть вопроса состоит в следующем: внутри класса (в определенной функции) могу лия получить доступ к конкретному полю переданной в класс структуры.
Ниже выделено жирным - это конечно не правильно, но хотесь бы что-нибуть такое ... Помогите пожалуйста, может есть какие-нибудь другие способы.
template<class T>
CHashTable<T>::IndexFile(char* pszFileName,int RecLen,int StartChar,int EndChar)
{
...
T.data=c; T.NumRec=i; buckets[k].AppendNode(T);
...
}
Вопрос следующего содержания: объявлен шаблонный класс
CHashTable. При его инициализации ему передается какаято структура, в моем случае
struct CPeopIdx0
{
char Data[20];
int NumRec;
};
Поля в структуре одни и те же, но могут менятся типы полей, например я могу передать
struct CPeopIdx1
{
BYTE Data[20];
int NumRec;
};
А суть вопроса состоит в следующем: внутри класса (в определенной функции) могу лия получить доступ к конкретному полю переданной в класс структуры.
Ниже выделено жирным - это конечно не правильно, но хотесь бы что-нибуть такое ... Помогите пожалуйста, может есть какие-нибудь другие способы.
template<class T>
CHashTable<T>::IndexFile(char* pszFileName,int RecLen,int StartChar,int EndChar)
{
...
T.data=c; T.NumRec=i; buckets[k].AppendNode(T);
...
}
Для начала, нельзя обратиться к полю структуры, если это поле не статическое. Можно обратиться лишь к полю в экземпляре этой структуры.
Т.о. существует два выхода:
1. Обратиться к полю в экземпляре структуры.
1.1 Создать экземпляр структуры внутри шаблонного класа:
template<class T>
class CHashTable {
public:
T PeopId;
...........
};
обращаемся к полям:
template<class T>
CHashTable<T>::IndexFile(char* pszFileName,int RecLen,int StartChar,int EndChar)
{
PeopId.data=c;
PeopId.NumRec=i;
}
1.2 Отнаследовать шаблонный класс от класса параметра шаблона:
template<class T>
class CHashTable :public T
{
...........
};
обращаемся к полям:
template<class T>
CHashTable<T>::IndexFile(char* pszFileName,int RecLen,int StartChar,int EndChar)
{
data=c;
NumRec=i;
}
или обращаемся к полям так:
CHashTable<CPeopIdx0> table;
table.data=c;
table.NumRec=i;
2. Сделать поля в передаваемой структуре статическими:
struct CPeopIdx0
{
static char Data[20];
static int NumRec;
};
template<class T>
class CHashTable :public T
{
typedef T TPeopId;
...........
};
обращаемся к полям:
template<class T>
CHashTable<T>::IndexFile(char* pszFileName,int RecLen,int StartChar,int EndChar)
{
TPeopId::data=c;
TPeopId::NumRec=i;
}
Псевдоним TPeopId в этом случае вводиться для доступа из вне шаблонного класса:
CHashTable<CPeopIdx0> table;
table.TPeopId::data=c;
table.TPeopId::NumRec=i;
При доступе лишь из функций-членов шаблонного класса можно обойтись и без псевдонима, т.е.
template<class T>
CHashTable<T>::IndexFile(char* pszFileName,int RecLen,int StartChar,int EndChar)
{
T::data=c;
T::NumRec=i;
}