【问题标题】:Declare a variable type using a string使用字符串声明变量类型
【发布时间】:2012-03-19 05:08:36
【问题描述】:

我有一个模板,我想用适当的对象类型调用它,而不必解析字符串标识符/枚举/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++ 中是可行的......

【问题讨论】:

  • 您是否尝试重新实现boost::variant
  • boost::variant 的访问者实现肯定会起作用,但这意味着从适当的 operator() 重载中调用我的模板化函数。没关系,我想。但是,如果我有几个我可能希望调用的模板化函数(我确实这样做了),它会变得有点复杂。如果这真的是唯一的选择,我可以看到使用 boost::variant...也许它比看起来更好...?
  • 我收回(一点)。如果我在调用之前将函数指针和对象引用传递给访问者,它确实会在一定程度上简化访问者的实现......不过,我对学习 C++ 很感兴趣,所以我仍然对任何替代方法感兴趣...... . 否则,看起来 boost::variant 可能是要走的路。

标签: c++ types declaration rtti


【解决方案1】:

您可以重新定义您的templateFunction 以便采用虚拟参数吗?

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

这样做你只需要在你调用函数的地方传递你的变量varType

templateFunction(varType);

【讨论】:

  • 就是这样 - 我实际上没有必要类型的变量。我想通过传递一个代表它的类型名称的字符串来生成一个类型的变量。有点像 typeid.name() 函数的反转 - 我指定一个字符串并取回指定类型的变量。
  • 我明白了,你的switch 例子让我很困惑。我认为没有“typeid().name() 反转”之类的东西,可能boost::variant 是您不太糟糕的选择。
猜你喜欢
  • 2018-02-20
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 2011-04-19
  • 2013-09-12
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多