В отличие от python, в C ++ int
не является объектом типа class
(или чего-то подобного). Вы не можете так сравнивать. Вместо этого вы можете использовать
template<typename ret>
ret copy(ret var)
{
if constexpr(std::is_same_v<ret, int>)
{
std::cout << "int\n";
}
// and so on....
Edit: (в ответ на комментарии yaodav)
Обратите внимание, что if constexpr
поддерживается только C ++ 17. Существуют альтернативы, такие как:
if (std::is_same<ret, int>::value)
{
std::cout << "int\n";
}
, но недостатком является то, что если нужно сделать что-то более сложное с var
, например var * 2
, то они получат синтаксическую ошибку для * 1016. * типа std::vector<int>
. Синтаксис if constexpr
не подвержен такого рода ошибкам, поскольку он не пытается скомпилировать код, когда if constexpr
ложно (он выполняет только базовый c синтаксический анализ, необходимый для поиска последнего }
.
Если нужна более старая версия C ++, тогда единственный жизнеспособный вариант - перегрузка:
void copy_helper(int var) {
std::cout << "int\n";
}
template <class T>
void copy_helper(const T&) {}
template<typename ret>
ret copy(ret var)
{
copy_helper(var);
Также обратите внимание (еще один комментарий yaodav), что использование такой конструкции if
является признаком плохой дизайн. В общем, я предпочитаю обусловливать вещи на основе свойств и возможностей, а не на определенных c типах (и мой пример перегрузки выше слишком узкий). Например, если мне нужен интегральный тип (с + , -, *, /, et c.), то я предпочитаю настраивать код на основе наличия этих возможностей.