首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用typeid检查模板类型

使用typeid检查模板类型
EN

Stack Overflow用户
提问于 2014-09-16 23:56:07
回答 2查看 13.3K关注 0票数 3

我想知道这样做是否安全:

代码语言:javascript
复制
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类型的参数;

我创建了一个模板类Parameter。

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

谢谢你的帮忙

EN

回答 2

Stack Overflow用户

发布于 2014-09-17 00:25:22

代码不能编译,但不是因为typeid。问题是,即使使用正确的if-clauses,您的方法的代码也需要编译-所有代码。这与代码的一部分是否被执行(=计算)无关。这就导致了这样的问题:如果Tint,那么您仍然需要能够为其他情况编译代码,例如,下面这行:

代码语言:javascript
复制
this->mstrings[p.name()] = p;

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

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

代码语言:javascript
复制
void Parameters::add(Parameter<int> p)
{
    this->mints[p.name()] = p;
}

对于其他情况也是如此。

最后注意:即使您使用typeid,也不需要探测器。您可以直接使用typeid(int)

票数 5
EN

Stack Overflow用户

发布于 2014-09-17 00:24:26

忽略这是否是一个好的编程实践...

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

18.5.1类type_info

..。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25873338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档