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

Ваш аккаунт

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

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

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

Шаблоны

2.0K
27 марта 2003 года
udgine
20 / / 04.03.2003
Вопрос следующего содержания: объявлен шаблонный класс
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);

...


}
3
27 марта 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by udgine
Вопрос следующего содержания: объявлен шаблонный класс
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;
}

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог