首先,代码
vector<T> kvec;
for (ulong kv = 0; kv < ke.count; kv++)
{
T key;
if (typeid(T) != typeid(QUAT32))
{
fread(&key, sizeof(T), 1, fh);
}
else{
shortQuat key16;
fread(&key16, sizeof(shortQuat), 1, fh);
key.Parse(key16);
}
kvec.push_back(key);
}
抛出以下编译器错误key.Parse(key16);
:
error C2039: 'Parse' : is not a member of 'libm2::VEC3F'
当然不是;但问题是任何具有 VEC3F 类型的东西都不应该到达那里。显然,编译器正在使用发送到片段所在类的第一种类型,这很好 - 但为什么要忽略条件呢?
是的,如果我注释掉该行,它编译得很好 - 并且条件在运行时工作得很好。
所以我想真正的问题是,处理这个问题的最佳方法是什么,而不必为一种特殊类型复制整个类?
扩展我的评论:
The if
在运行时运行,而不是在编译时运行(优化器可能会删除分支,但它必须首先进行编译才能达到这一点)。
您可以使用模板专门化来代替,这is在编译时完成(编译器为您提供的每种类型实例化模板化函数的单独副本before编译它)。您可以提供专门化来为特定类型强制使用不同的(特殊)函数体,这正是您在本例中想要的。
这是从您问题中的代码派生的示例(我假设 double-push_back 为kvec
对于非 QUAT32 是一个拼写错误):
template<typename T>
inline void readKey(T& key, FILE* fh)
{
fread(&key, sizeof(T), 1, fh);
}
template<>
inline void readKey<QUAT32>(QUAT32& key, FILE* fh)
{
shortQuat key16;
fread(&key16, sizeof(shortQuat), 1, fh);
key.Parse(key16);
}
// ...
vector<T> kvec;
for (ulong kv = 0; kv < ke.count; kv++)
{
T key;
readKey(key, fh);
kvec.push_back(key);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)