2012-02-29 126 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")>(); 

东西就像一个反向typeid?

我实际上设法做到这一点在VBA一次,所以我想它必须在C++可行...

+0

你们是不是要重新实现'提高:: variant'? – kennytm 2012-02-29 17:45:11

+0

boost :: variant的访客实现肯定会起作用,但意味着在approprite operator()重载中调用我的模板化函数。没关系,我想。不过,如果我有几个模板函数,我可能会打电话(我也会这样做),但它会变得更复杂一些。我可以看到使用boost :: variant,如果这真的是唯一的选择...也许这是一个比看起来更好的选择...? – 2012-02-29 18:32:32

+0

我拿回来了(一点)。如果我在调用访问器之前向访问者传递了一个函数指针和一个对象引用,它确实可以简化访问者的实现......但是,我是学习C++的一个坚果,所以我仍然对任何其他方法感兴趣。否则,看起来像boost :: variant可能是要走的路。 – 2012-02-29 18:42:15

回答

0

你可以重新定义你的templateFunction所以采取虚拟参数?

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

这样做,你只需要通过您的变量varType,你调用该函数:

templateFunction(varType); 
+0

就是这样 - 我实际上没有必要类型的变量。我想通过传递一个表示类型名称的字符串来生成一个类型的变量。有点像typeid.name()函数的反转 - 我指定一个字符串并取回指定类型的变量。 – 2012-02-29 18:13:20

+0

我明白,你的'switch'例子让我困惑。我不认为有''typeid()。name()'reversal'这样的事情,可能'boost :: variant'是你的不良选择。 – 2012-02-29 18:38:00