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

Ваш аккаунт

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

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

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

Возможно ли передать параметром ф-ии имя поля структуры?

538
29 октября 2008 года
AVDEY
188 / / 17.11.2005
Возможно ли передать параметром ф-ии имя поля структуры?

Например есть структура:
Код:
typedef struct _Data
{
    int YY;
    int XX;
    int ZZ;
} DATA, *LPDATA;

//Хочу создать шаблон функции.
template <class type, class name> int MyFun(type t, name n)
{
    return t[0].n;
}
//То есть первым параметром указатель на масив структур а вторим имя поля.
//Возможно ли такое?
562
29 октября 2008 года
tarekon
175 / / 19.08.2003
Возможно.

 
Код:
template< class CLASS, typename TYPE >
TYPE function( CLASS* array, TYPE CLASS::*member )
{[INDENT]return array[0].*member;[/INDENT]}

DATA someData[10];
function( someData, &DATA::YY );
538
29 октября 2008 года
AVDEY
188 / / 17.11.2005
Спасибо. Все работает. Но не могу понять что происходит при этом:

 
Код:
TYPE CLASS::*member
//То же самое именно для этого примера можно записать так:
int DATA::* member

По логике можно догадаться что создаеться указатель на тип int структуры DATA.
Но я бы хотел поподробней для себя понять.
Если возможно дайте ссылку на инфу.
Спасибо.
562
30 октября 2008 года
tarekon
175 / / 19.08.2003
Подробности и другие примеры можно поискать по фразе "Pointer to member". В основном встречаются указатели на методы класса, но если понять их, то указатели на поля класса понять легко ;).
538
30 октября 2008 года
AVDEY
188 / / 17.11.2005
Спасибо.
И ещё один вопрос по шаблонах функций.
Ошибка при линковке LNK2001:
Код:
[color=green]//В хеад файле пишу[/color]
[color=green]//tem.h[/color]
[color=blue]#if[/color] ![color=blue]defined[/color](tem_H)
[color=blue]#define[/color] tem_H
[color=blue]template[/color]< [color=blue]class[/color] CLASS, [color=blue]typename[/color] TYPE >
TYPE function( CLASS* array, TYPE CLASS::*member );
[color=blue]#endif[/color]
[color=green]////////////////////////////////////////////////////////////////////////[/color]

[color=green]//tem.cpp[/color]
[color=blue]#include[/color] "struc.h" [color=green]//файл с описанием структуры[/color]
[color=blue]#include[/color] "tem.h"

[color=blue]template[/color]< [color=blue]class[/color] CLASS, [color=blue]typename[/color] TYPE >
TYPE function( CLASS* array, TYPE CLASS::*member )
{
    [color=blue]return[/color] array[0].*member;
}
[color=green]////////////////////////////////////////////////////////////////////////////[/color]

[color=green]//Вызываю в my.cpp[/color]
[color=green]//my.cpp[/color]
[color=blue]#include[/color] "struc.h" [color=green]//файл с описанием структуры[/color]
[color=blue]#include[/color] "tem.h"
[color=blue]void[/color] main()
{
DATA someData[10];
function( someData, &DATA::YY );
}
562
31 октября 2008 года
tarekon
175 / / 19.08.2003
Шаблонный класс/функцию не стоит определять в отдельной единице трансляции!

Когда компилятор встречает вызов шаблонной функции, он пытается найти её определение. Если он его находит, то он инстанциирует шаблон с заданными параметрами, помещает его в текущий модуль и делает ссылку на него.

Если компилятор не находит определение, то он помещает внешнюю сслыку на эту функцию в надежде, что линкеру-то точно повезет. Но линкеру в твоем случае не везет - компилятор не делает инстанциирования необходимого шаблона нигде.

---------------

Если проще, то всегда нужно понимать, что cpp файлы компилируются независимо. А для того, чтобы можно было выполнить шаблонную функцию, надо, чтобы компилятор смог подставить в её реализацию необходимые типы. Тоо. если ты сделаешь реализацию в одном cpp файле, то при компиляции другого компилятор просто не найдет, куда ж эти типы подставить.

Поэтому шаблонные классы/функции объявляются и определяются в заголовочных файлах. Перенеси код из cpp в h.

Кстати, именно из-за этого использование шаблонов часто раздувает размер итогового модуля.
538
31 октября 2008 года
AVDEY
188 / / 17.11.2005
Большое спасибо.
Конечно я уже нашёл что шаблон надо описывать в *.h файлах. :)
А то что шаблон "раздувает" код это я знаю, но по моему лучше описать шаблон чем две функции, так как не известно будет ли она использоваться для иного типа.
А так компилятор сам создаст функции для определённых типов даных.
Или я чот не правильно понял?
562
31 октября 2008 года
tarekon
175 / / 19.08.2003
Да, всё правильно.:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог