2010-01-22 2 views
0

Можно ли сделать что-то вдоль линий:хранения введите тип для обработки переменных списков аргументов

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

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

+1

Если вам нужно знать тип во время выполнения, в вашем дизайне обычно что-то не так. Лучшее объяснение проблемы, которую вы пытаетесь решить, может помочь. –

ответ

5

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

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

+0

Не забывайте, что есть RTTI, который позволяет обрабатывать некоторые типы. – Skizz

+0

Мысль так. На самом деле не хочу описывать это, поскольку я смущен. Я когда-либо придумывал эту идею, но это спасло бы время, если бы это было возможно. благодаря – Patrick

1

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

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

1

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

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

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

0

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