我想知道执行以下操作是否安全:
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
。问题是即使是正确的if
-clauses,你的方法的代码需要被编译——所有的。这与代码的一部分是否被执行(=评估)无关。这导致了一个问题,如果T
is int
,您仍然需要能够编译其他情况的代码,例如这一行:
this->mstrings[p.name()] = p;
的类型mstrings
很可能与通过不兼容Parameter<int>
as p
,因此你会得到一个编译错误。
解决方案是使用重载,其中每个方法必须只编译一种情况,而不编译其他情况,例如int
:
void Parameters::add(Parameter<int> p)
{
this->mints[p.name()] = p;
}
其他情况也是如此。
最后注意:即使您使用typeid
,你不需要探针。你可以简单地使用typeid(int)
直接地。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)