【发布时间】:2019-08-17 07:10:27
【问题描述】:
我有一个设计选择。我有一个模板化类myClass<T>,它有一个T 类型的成员data_。目前,打算支持int,几种复杂类型,和double;从而产生了三类模板:浮点型、整数型和复数型。
函数checkValidity(),检查类myClass的对象的有效性,现在仅限于使用std::isfinite()检查data_的有限性。
目前实现了这个功能,如下:
template<class T>
bool myClass<T>::checkValidity() const noexcept
{
if constexpr(std::is_floating_point_v<T> || std::is_integral_v<T>)
{
return std::isfinite(this->data_);
}
else if constexpr(is_complex<T>{})
{
return (std::isfinite(this->data_.real()) && std::isfinite(this->data_.imag()))
}
else static_assert(assert_false<T>::value , "wrong type");
}
其中is_complex<T>{} 和assert_false<T> 是简单的自定义书面特征,它们确定类型是否是受支持的复杂类型之一,并简单地防止使用不支持的T 类型进行编译,该类型已被错误地用于实例化,分别。
现在,我想知道,由于integral types are always finite,将条件从第一个constexpr if 分支移出是否有意义,如下所示:
if constexpr(std::is_integral_v<T>)
{
return true;
}
?
因为据我了解std::isfinite(value),其中value 是整数类型将始终返回true。
差不多可以归结为这个问题:
- 当已知整数类型(如我的示例)时,明确检查整数类型的有限性是否有意义?
- 我是否希望编译器针对
T = int的情况优化我未修改的版本?
场地:
- 实际上,
data_是一个大数组; -
checkValidity()函数中正在发生更多事情; - 这个函数位于代码的关键路径上;
- 整数类型总是有限的,
std::isfinite()is supposed to check the finiteness by casting todouble让我确信我不会从实际执行检查中获得任何信息。
【问题讨论】:
-
关于编译器是否足够聪明以优化 is_finite 调用,答案似乎是肯定的:godbolt.org/z/awCMhc
-
您的整个问题都有错字。是
std::isfinite不是std::is_finite;) 除此之外,我同意@Chuu Plus...std::isfinite不是constexpr。如果这对你很重要...... -
@jan.sende 非常感谢!固定的。我的注意力转移到使其他所有语法都正确。
std::isfinite不是constexpr的事实无关紧要。 -
@Chuu 好观察!