让std :: complex <double>传递std :: is_floating_point test </double>

时间:2014-08-17 00:17:57

标签: c++ templates c++11 static-assert

我希望类型doublefloatcomplex<double>complex<float>传递static_assert条件。我认为static_assert(std::is_floating<T>::value, "some message")可以解决这个问题,但是复杂类型没有通过这个测试(至少在gcc-4.10下)。

我会添加什么谓词来确保这四种类型(也许long double)被允许作为模板实例化,但没有别的?

2 个答案:

答案 0 :(得分:10)

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

  

为任何一个添加特化的程序的行为   本子条款中定义的类模板是未定义的,除非   否则指定。

目前,如果特殊化中的至少一个模板参数是用户定义的类型,则允许用户添加特征的唯一类型特征类是std::common_type(§20.10.7.6[meta.trans。其他],表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> { };

Demo

答案 1 :(得分: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");
}

Live example