问题描述
我正在尝试为模板化的数学类生成准确的代码覆盖率。我默认使用here
中的技巧实例化模板类中的每个方法template class Vector2D<float>;
,因此覆盖率并不总是100%,而是向我显示从未调用过函数的位置。问题是,如果我走得更远并且使用 type traits (类型特征)来仅对某些类型启用模板化类的成员函数,则它们的覆盖率始终始终为100%。 gcov和llvm-cov 均显示未生成这些函数。 我猜是因为这些功能是模板类中自己的“模板”?
template<typename T>
class Vector2D {
...
template <class U = T>
typename std::enable_if<std::is_floating_point<U>::value,void>::type rotate(
T angle) {
...
}
};
我(默认)如何实例化这些功能,以便覆盖率报告如果从未调用过,将以橙色/红色显示?
解决方法
以与类相同的方式,可以显式实例化函数/方法:
template
typename std::enable_if<std::is_floating_point<F>::value,void>::type
Vector2D<float>::rotate<float>(float);
使用C ++ 20 requires
,使用:
template<typename T>
class Vector2D {
//...
void rotate(T angle) requires(std::is_floating_point<T>::value) {
//...
}
};
我希望只需要显式的类实例化。
,我最终显式实例化了模板成员函数(请参见this post)
template void Vector2D<float>::rotate<float>(float);
如果我确实未在代码中显式调用该函数,则覆盖率报告随后将该函数显示为从未调用(橙色/红色)。