Russian Qt Forum

Qt => Общие вопросы => Тема начата: tux от Апрель 04, 2020, 22:50



Название: Шаблоны cpp
Отправлено: tux от Апрель 04, 2020, 22:50
Доброго времени суток.
Есть некоторое количество чужого кода, доставшегося по наследству. В нём 100500 функций, имеющие общий вид типа
Код:
int MegaClass::f0(void)
{
   XXX1 *t_data = reinterpret_cast<XXX1 *>(input.data());
   тут делаем определенные операции с этим t_data и возвращаем результат
   return t_data->res;
}
int MegaClass::f1(void)
{
   XXX2 *t_data = reinterpret_cast<XXX2 *>(input.data());
   тут делаем определенные операции с этим t_data и возвращаем результат
   return t_data->res;
}
...
int MegaClass::f100(void)
{
   XXX101 *t_data = reinterpret_cast<XXX101 *>(input.data());
   тут делаем определенные операции с этим t_data и возвращаем результат
   return t_data->res;
}
где XXX* - это union, а input - QByteArray
решил сделать шаблон, чтобы хотя бы укоротить код
Код:
template<typename T>
int MegaClass::template_f(T qq)
{
   qq *t_data = reinterpret_cast<qq *>(input.data());
   тут делаем определенные операции с этим t_data и возвращаем результат
   return t_data->res;
}
и получил ошибку: error: ‘t_data’ was not declared in this scope
Как такой шаблон правильно написать?
Эмоции за сам подобный код прошу оставить в стороне, вопрос не про это.


Название: Re: Шаблоны cpp
Отправлено: Авварон от Апрель 04, 2020, 23:10
У вас проблема в ку-ку:

Код:
template<typename T>
int MegaClass::template_f(void)
{
   T *t_data = reinterpret_cast<T *>(input.data());
   тут делаем определенные операции с этим t_data и возвращаем результат
   return t_data->res;
}

ку-ку - это имя _переменной_ типа Т которую вы передаете в шаблон (в оригинальных функциях ничего не передавалось). Это не имя типа.


Название: Re: Шаблоны cpp
Отправлено: tux от Апрель 04, 2020, 23:18
У вас проблема в ку-ку:

Код:
template<typename T>
int MegaClass::template_f(void)
{
   T *t_data = reinterpret_cast<T *>(input.data());
   тут делаем определенные операции с этим t_data и возвращаем результат
   return t_data->res;
}

ку-ку - это имя _переменной_ типа Т которую вы передаете в шаблон (в оригинальных функциях ничего не передавалось). Это не имя типа.
Эээ... и как я потом в этот шаблон тип передам? Я ведь предполагал далее писать, что-то типа
Код:
 return template_f(XXX1); 
Просто "свернуть" функции, сделать их компактнее.


Название: Re: Шаблоны cpp
Отправлено: Авварон от Апрель 04, 2020, 23:23
Теперь наоборот, вы передаете ТИП вместо переменной. "передача" типа в шаблон явно указывается в <>:
Код:
return template_f<XXX1>();

Возможность не указывать тип - это бонус и называется Template argument deduction (https://en.cppreference.com/w/cpp/language/template_argument_deduction):

Код:
int m1 = std::max(100, 200); // ОК
int m2 = std::max<int>(100, 200); // тоже ОК
double m3 = std::max<double>(100.5, 200); // а надо это для мест когда тип определить невозможно, первый double, а второй int


Название: Re: Шаблоны cpp
Отправлено: tux от Апрель 04, 2020, 23:34
Мда. Век живи - век учись!
Спасибо!