C ++中的enable_if模板类功能的介绍

问题描述

我正在尝试为模板化的数学类生成准确的代码覆盖率。我认使用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);

如果我确实未在代码中显式调用该函数,则覆盖率报告随后将该函数显示为从未调用(橙色/红色)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...