2012-02-29 5 views
0

У меня есть шаблон, который я хочу позвонить с соответствующим типом объекта без необходимости разобрать строку идентификатора/перечислимую/typeid.name() и т.д.Объявляет тип переменной, используя строку

То есть, вместо чем:

switch(varType) 
{ 
case TYPE_ONE: 
    templateFunction<TYPE_ONE>(); 
    break; 

case TYPE_TWO: 
    templateFunction<TYPE_TWO>(); 
    break; 
... 
etc... 
} 

Я предпочел бы использовать:

templateFunction<GetTypeFromEnum(MyEnum::INT)>(); 

или еще лучше:

templateFunction<GetTypeFromString("int")>(); 

Что-то вроде обратного типа?

Я на самом деле удалось сделать это в VBA один раз, так что я предполагаю, что это должно быть выполнимо в C++ ...

+0

Вы пытаетесь переописать 'повысить :: variant'? – kennytm

+0

boost: реализация посетителя варианта варианта, безусловно, будет работать, но не означает вызов моей шаблонной функции из допустимой перегрузки operator(). Все в порядке, я полагаю. Это немного усложняется, хотя, если у меня есть несколько шаблонных функций, которые я, возможно, захочу назвать (и я). Я могу видеть использование boost :: variant, если это действительно единственный вариант ... Может быть, это лучший вариант, чем кажется ...? –

+0

Я беру это назад (немного). Если я передаю указатель на функцию и ссылку на объект перед посетителем, прежде чем вызывать его, это несколько упростит реализацию посетителя ... Тем не менее, я нахожусь в курсе изучения C++, поэтому меня все еще интересуют любые альтернативные методы. В противном случае, похоже, что boost :: variant может быть способом. –

ответ

0

Можете ли вы пересмотреть ваши templateFunction так взять фиктивный параметр?

template <typename T> 
void templateFunction(const T& Dummy) 
{ 
    // Do nothing with Dummy 
} 

Это вы просто должны проходить переменную varType где вы вызываете функцию:

templateFunction(varType); 
+0

Вот только это - на самом деле у меня нет переменной необходимого типа. Я хочу сгенерировать переменную типа, передав строку, которая представляет ее имя типа. Подобно обращению функции typeid.name() - я указываю строку и возвращаю переменную указанного типа. –

+0

Насколько я понимаю, ваш пример «switch» меня смутил. Я не думаю, что есть такая вещь, как '' typeid(). Name() 'reversal ', вероятно,' boost :: variant' - ваш беспроигрышный выбор. –

Смежные вопросы