Написал функцию шаблон:
template <typename T1, typename T2>
void FillToolTips(T1 ID, T2 szTipText);
template <typename T1, typename T2>
void CParamDlg::FillToolTips(T1 ID, T2 szTipText)
//
//Заполнение тултипов
//
{
for(int i=0; i<sizeof(ID)/sizeof(int); ++i)
m_ToolTip.AddTool(GetDlgItem(ID[i]), szTipText[i]);
}
Вызываю так:
//Заполняем тултипы
static int ID[] =
{
IDOK,
IDCANCEL
};
static char *szTipText[] =
{
"Внести изменения и закрыть окно",
"Закрыть окно без учета изменений"
};
FillToolTips(ID, szTipText);
...
Давай по порядку:
// ID здесь имеет тип int[2]
// А так так в С++ нельзя передавать массивы в ф-ии по значению,
// то применяется 'array-to-pointer' преобразование
FillToolTips(ID, szTipText);
// В результате чего тип T1 в шаблоне будет 'int*'
// и размер массива будет потерян
template <typename T1, typename T2>
void FillToolTips(T1 ID, T2 szTipText);
Для того чтобы в функции можно было узнать размер массива
можно передавать ссылку на массив:
template <typename T1, typename T2>
void FillToolTips(T1
& ID, T2 szTipText);
тогда выражение 'sizeof(ID)/sizeof(int)' даст правильный результат
Второй, более правильный вариант - заставить компилятор выводить
размер массива самостоятельно:
template <typename T1, typename T2, size_t N>
void FillToolTips(const T1 (&ID)[N], T2 szTipText)
{}
Значение N будет выведено автоматически (но этот вариант поддерживают не все компиляторы, к числу которых относится VC6).
Обнаружил такую особенность если передавать массив int[2] в шаблон то он будет инстанцирован как int* а если передавать не сам массив а ссылку на массив int[2]& тогда он правильно инстанцируется с типом int[2] интересно с чем это связано?
см.выше
--------------------------------
Для массива получается что не вызывается конструктор копирования?
Маасивы никогда не передаются по значению и конструкторов копирования не имеют
При передаче имени массива на самом деле передается адрес первого элемента - наследие С.
Это не всегода верно. Что передаеться, на самом деле зависит от типа параметра функции.
Выше я обяъснял, что может передаваться как указатель на первый элемент, так и ссылка на массив.