我想知道这样做是否安全:
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种类型中的一种,这将会失败。但这不是问题,因为我知道参数只能是这些类型。
谢谢你的帮忙
发布于 2014-09-17 00:25:22
代码不能编译,但不是因为typeid。问题是,即使使用正确的if-clauses,您的方法的代码也需要编译-所有代码。这与代码的一部分是否被执行(=计算)无关。这就导致了这样的问题:如果T为int,那么您仍然需要能够为其他情况编译代码,例如,下面这行:
this->mstrings[p.name()] = p;mstrings的类型很可能与将Parameter<int>作为p传递不兼容,因此会出现编译错误。
解决方案是使用重载,其中每个方法只能编译一个用例,而不编译其他用例,例如int
void Parameters::add(Parameter<int> p)
{
this->mints[p.name()] = p;
}对于其他情况也是如此。
最后注意:即使您使用typeid,也不需要探测器。您可以直接使用typeid(int)。
发布于 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。
https://stackoverflow.com/questions/25873338
复制相似问题