хранение типа типа для обработки переменных списков аргументов - PullRequest
0 голосов
/ 22 января 2010

Можно ли сделать что-то вроде:

type t = int;//this would be a function which identifies what type the next argument is
if( t == int )
    printf( "%d", va_arg( theva_list, t ) );

относительно тривиальным образом? Единственный известный мне объект, который может содержать тип, это type_info, и я не могу понять, как использовать его таким образом.

Спасибо, Patrick

Ответы [ 4 ]

5 голосов
/ 22 января 2010

Вообще говоря, нет. Типы могут действительно храниться, обрабатываться и т. Д. Только во время компиляции. Если вы хотите что-то во время выполнения, вы должны преобразовать (обычно с помощью довольно метапрограммирования) тип в какое-то значение (например, перечисление).

Возможно, было бы лучше, если бы вы дали более высокоуровневое описание того, что вы на самом деле пытаетесь выполнить здесь - комбинация списков переменных аргументов с попыткой «включить тип» звучит как авария поезда, которая вот-вот бывает ...

1 голос
/ 22 января 2010

Использовать специализацию:

  void smart_print(int t)
  {
     printf("%d", i);
  }
  void smart_print(double f)
  {
     printf("%g", f);
  }

Но с помощью шаблонов вы также можете разрешить указатель на ожидаемую функцию, поэтому рассматривайте указатель как идентификатор типа, и вы получите желаемый результат

1 голос
/ 22 января 2010

Не так, как вы думаете. Типы типа "int" оцениваются в типе компиляции. Вы хотите оценить тип во время выполнения.

Возможно, вы хотите сделать ссылку "t" на функцию или экземпляр класса, который имеет виртуальную функцию, по одной для каждого типа. По сути, вам нужен шаблон команды, где команда является «отформатировать значение», а различные экземпляры команды соответствуют различным типам, которые могут быть отформатированы.

0 голосов
/ 22 января 2010

Вы должны посмотреть, как работают операторы << и >> для потоковых классов (например, cout и cin). Возможно, это даст вам представление о том, как решить ваши проблемы - то есть перегруженные функции.

...