获得标准::复杂<double>通过标准::is_floating_point测试

Getting std::complex<double> to pass std::is_floating_point test

本文关键字:标准 is point 测试 floating double 复杂 lt gt      更新时间:2023-10-16

我希望类型double, float, complex<double>complex<float>通过static_assert条件。我认为static_assert(std::is_floating<T>::value, "some message")可以做到这一点,但是复杂的类型不能通过这个测试(至少在gcc-4.10下)。

我应该添加什么谓词来确保这四种类型(可能还有long double)被允许作为模板实例化,而不是其他类型?

为标准库类型trait类添加特化通常是非法的,即使对于用户定义的类型也是如此。§20.10.2 [meta.type.synop]/p1:

程序的行为,它为任何类型的对象添加专门化本款中定义的类模板是未定义的,除非另有说明。

目前,唯一允许用户添加专门化的类型trait类是std::common_type,如果专门化中至少有一个模板参数是用户定义的类型(§20.10.7.6 [meta.trans.])。

你需要写你自己的trait,这并不难:

template<class T>
struct is_complex_or_floating_point : std::is_floating_point<T> { };
template<class T>
struct is_complex_or_floating_point<std::complex<T>> : std::is_floating_point<T> { };

演示。

如果你愿意使用Boost。类型特征,它们提供boost::is_complexstd::complex一起使用。

#include <complex>
#include <type_traits>
#include <boost/type_traits.hpp>
int main()
{
    static_assert(std::is_floating_point<float>::value, "some message");
    static_assert(std::is_floating_point<double>::value, "some message");
    static_assert(boost::is_complex<std::complex<float>>::value, "some message");
    static_assert(boost::is_complex<std::complex<double>>::value, "some message");
}
<<p> 生活例子/kbd>