хранение типа типа для обработки списков переменных аргументов

StackOverflow https://stackoverflow.com/questions/2118238

Вопрос

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

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, и я не могу понять, как использовать его таким образом.

Спасибо, Патрик

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top