仅当类型为 std::complex 时,才进行缩放



我有以下模板函数:

template <typename T0>
struct ComplexTypeTraits
{
using type = T0;
};
template <typename T0>
struct ComplexTypeTraits<std::complex<T0> >
{
using type = T0;
};
template<typename T>
void myFunction(T& out, const T & in)
{
using T1 = typename ComplexTypeTraits<T>::type; // will be 'T' for std::complex<T>
out = in;
if(std::is_same<T, T1>::value == false)
{// if the type is std::complex<T>, do a scaling
const T1 theta = M_PI/2.0;
const T y(std::cos(theta),-1*std::sin(theta));
out = out*y;
}
}

对函数的以下调用有效:

std::complex<float> in(10, 5);
std::complex<float> out = 0;
myFunction<std::complex<float>>(out, in);
std::cout<<"out is: "<<out<<std::endl;

但是,当我以以下方式调用该函数时,会给出错误"标量初始值设定项中的多余元素。

float in = 10;
float out = 0;
myFunction<float>(out, in);

基本上,如果参数类型为 std::complex,我想进行缩放。如何解决问题? std::cout<<"out 是:"<</div>

该函数无法编译,因为该行const T y(std::cos(theta),-1*std::sin(theta));仍然需要有效; 不是在T = float

。如果出现以下情况,则使用 C++17 的 constexpr 很容易解决:

if constexpr (std::is_same<T, T1>::value == false)

如果无法使用 C++17,则可以使用标记调度:

template<typename T>
struct is_complex : std::false_type {};
template<typename T>
struct is_complex<std::complex<T>> : std::true_type {};
template<typename T>
void myFunction_impl(T& out, const T& in, std::false_type)
{
// Nothing to do
}
template<typename T>
void myFunction_impl(T& out, const T& in, std::true_type)
{
// T is a std::complex, do scaling
const typename T::value_type theta = M_PI/2.0;
const T y(std::cos(theta),-1*std::sin(theta));
out = out*y;
}
template<typename T>
void myFunction(T& out, const T& in)
{
out = in;
myFunction_impl(out, in, is_complex<T>{});
}

演示

请注意,直接重载不起作用,因为在尝试选择正确的重载时,std::complex<T>参数将解析为std::complex<std::complex<T>>

最新更新