让std::complex<double>通过std::is_floating_point测试

5
我希望类型doublefloatcomplex<double>complex<float>可以通过static_assert的条件。我认为static_assert(std::is_floating<T>::value, "some message")可以解决问题,但是复数类型在这个测试中不会通过(至少在gcc-4.10下)。
我应该添加什么谓词,以确保这四种类型(以及可能的long double)作为模板实例化被允许,但是没有其他类型被允许呢?
2个回答

10

通常情况下,即使对于用户定义的类型,向标准库类型特征类添加专门化也是非法的。 §20.10.2 [meta.type.synop]/p1:

程序为任何在此子句中定义的类模板添加专门化的行为是未定义的,除非另有规定。

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

你需要编写自己的特征类,这并不难:

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> { };

演示


1
不错,我不知道那个。 - 101010

1
如果您愿意使用Boost.TypeTraits,它们提供了boost::is_complex可用于与std::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");
}

实时例子


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接