【问题标题】:Using typeid to check for template type使用 typeid 检查模板类型
【发布时间】:2014-09-16 15:56:06
【问题描述】:

我想知道执行以下操作是否安全:

template<class T>
void Parameters::add(Parameter<T> p)
{
   std::string sprobe("");
   int iprobe = 0;
   double dprobe = 0.;

   if (typeid(T) == typeid(sprobe))
     this->mstrings[p.name()] = p;

   if (typeid(T) == typeid(iprobe))
     this->mints[p.name()] = p;

   if (typeid(T) == typeid(dprobe))
     this->mdoubles[p.name()] = p;
}

我有一个用于存储参数的类。它有 3 个 boost::unordered_map 成员变量,用于存储 int、double 和 std::string 类型的参数;

我创建了一个模板类参数。

我了解,如果我的参数不是我预期的 3 种类型之一,这将失败。但这不是问题,因为我知道参数只能是这些类型。

感谢您的帮助

【问题讨论】:

  • 听起来你想要模板专业化。甚至只是重载。
  • 你为什么不重载你的函数?
  • 我认为重载可以解决问题。非常感谢 但是在这种情况下使用 typeid 是否安全?
  • typeid 是 RTTI,它可能根本没有启用,而且它会丢弃 cv 限定符
  • @PiotrS。所以我想这是一个不 :) 谢谢

标签: c++ templates typeid


【解决方案1】:

代码无法编译,但不是因为typeid。问题是,即使使用正确的if-clauses,您的方法的代码也需要编译——全部编译。这与代码的一部分是否被执行(=评估)无关。这会导致问题,如果Tint,您仍然需要能够编译其他情况的代码,例如,这一行:

this->mstrings[p.name()] = p;

mstrings 的类型很可能与将Parameter&lt;int&gt; 传递为p 不兼容,因此会出现编译错误。

解决方案是使用重载,其中每个方法只能编译一种情况,而不能编译其他情况,例如int

void Parameters::add(Parameter<int> p)
{
    this->mints[p.name()] = p;
}

对于其他情况也是如此。

最后说明:即使您使用typeid,也不需要探针。您可以直接使用typeid(int)

【讨论】:

    【解决方案2】:

    忽略这是否是一种好的编程习惯......

    从语言的角度来看,您的程序是安全的。 type_info 的比较,typeid 运算符返回的值,在标准中得到了很好的定义:

    18.5.1 类类型信息

    ...

    bool operator==(const type_info&amp; rhs) const;

    2 效果:将当前对象与rhs进行比较。

    3 返回: true 如果两个值描述相同的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2017-05-08
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多