Как получить переменную no аргумента с ее размером в C ++, используя шаблон variadi c - PullRequest
2 голосов
/ 06 января 2020

Мне нужно создать функцию, которая принимает переменную № аргумента. Цель этой функции - получить аргумент и распечатать данные. Мне удалось реализовать эту функцию с использованием шаблона variadi c, код которого приведен ниже:

void print(T var1, Types... var2) 
{ 
        cout << "DATA:"<<var1<< endl ;      
        print(var2...) ; 
}

Но теперь я хочу также напечатать размер аргумента. Например:

char empname[15+1];
print(empname);

Должен быть напечатан размер empname: 16. Но он печатает 8, так как печатает размер типа данных аргумента шаблона.

Любой способ получить размер каждого аргумента в пакете параметров, так как я все еще изучаю шаблон C ++ 11 variadi c.

Ответы [ 2 ]

3 голосов
/ 06 января 2020

Я предполагаю, что вы пытаетесь сделать что-то вроде:

(Пожалуйста, в следующий раз укажите весь код, который вы пробовали)

void print() {}

template <typename T, typename... Types>
void print(T var1, Types... var2)
{
  cout << "SIZE:"<<sizeof(var1)<< endl ;
  print(var2...) ;
}

И когда вы попытаетесь запустить это:

  char empname[15+1];
  print(empname);

Вы получаете SIZE:8 размером char *. Массив распадается на указатель, когда он передается параметру функции. Это происходит из-за затухания массива в указатель .

Так что, если вы укажете параметр шаблона вручную как ссылку на массив, он будет работать нормально.

  char empname[15+1];
  print<char (&)[16]>(empname);

Однако это, вероятно, не то, что вы хотите. Чтобы предотвратить распады, вы можете просто изменить тип аргумента на ссылку. Подробное описание здесь .

template <typename T, typename... Types>
void print(T& var1, Types&... var2)
{
  cout << "SIZE:"<<sizeof(var1)<< endl ;
  print(var2...) ;
}
2 голосов
/ 06 января 2020

Просто чтобы добавить еще один пример к ответу @Hanjoung Lee, вы также можете получить размер вашего массива, например:

template <typename T, std::size_t Size, typename... Types>
void print(T (&)[Size], Types&... var2)
{
    std::cout << "SIZE:" << Size << std::endl;
    print(var2...);
}
...