【发布时间】:2016-10-15 19:02:33
【问题描述】:
我有一个为我的数组生成随机数的函数。我为浮点数和整数创建了两个重载,如下所示:
template <typename T, int M = 0>
typename std::enable_if<std::is_floating_point<T>::value && std::is_scalar<T>::value,MyArray<T,M> >::type
Random()
{
//...
}
template <typename T, int M = 0>
typename std::enable_if<std::is_integral<T>::value && std::is_scalar<T>::value, MyArray<T,M> >::type
Random()
{
//...
}
这些函数可以通过以下方式调用:
MyArray<int> i = Random<int>();
MyArray<double> d = Random<double>();
我想达到同样的效果,但使用std::complex<T>,其中T 可以是任何浮点类型(最初 double 和 float 就足够了)。我希望能够做到这一点:
//This is what I'm trying to achieve
MyArray<std::complex<double> > = Random<std::complex<double>>();
MyArray<std::complex<float > > = Random<std::complex<float >>();
我无法完全做到这一点,但能够做到:
Random<std::complex,double>()
使用模板模板参数,这不是我要找的。p>
如何让<std::complex<double>>(或浮点数)的重载工作?
【问题讨论】:
-
std::is_same
>::value 不起作用? -
@DeiDei 这怎么可能?这看起来是递归的!反正我会试试的。
-
@DeiDei Nope... 不起作用。它说重载
MyArray<std::complex<double> >没有匹配函数。 -
template<typename T, int M = 0> typename std::enable_if<std::is_same<T, complex<double> >::value, MyArray<complex<double>,M> >::type你确定吗? -
@DeiDei 我不想专攻双倍。我希望检测到
double。如果它是浮动的呢?我不想重写float函数。
标签: c++ c++11 templates sfinae complex-numbers