在C ++中将static_cast complex <short>转换为complex <double>

时间:2018-07-05 07:47:25

标签: c++ c++11 casting eigen static-cast

我想使用static_cast将complex 转换为complex

Convert complex<int16_t> to complex<double>

我正在尝试做与这篇文章相同的事情,但是我需要使用static_cast。我不能使用该解决方案的原因是因为我使用的Eigen在其cast()函数中使用了static_cast。有没有办法扩展static_cast的功能以这种方式进行转换?还是有办法扩展Eigen的cast()函数来处理这种转换?

这基本上是我要尝试的:

Eigen::Array<std::complex<short>, Eigen::Dynamic, 1> short_array;
Eigen::Array<std::complex<double>, Eigen::Dynamic, 1> double_array;
double_array = short_array.cast< std::complex<double> >();

3 个答案:

答案 0 :(得分:6)

如果没有这样的cast函数,我会这样做:

Eigen::Array<std::complex<short>, Eigen::Dynamic, 1> short_array;
Eigen::Array<std::complex<double>, Eigen::Dynamic, 1> double_array;
double_array = short_array.unaryExpr(ptr_fun(complex_cast<double, short>));

其中的复杂转换函数可能如下所示:

template<class T, class U>
std::complex<T> complex_cast(const std::complex<U> &c) {
    return { static_cast<T>(c.real()), static_cast<T>(c.imag()) };
}

答案 1 :(得分:3)

我担心,我没有开悟的答案。您可以扩展std::complex来提供转换操作符:

#include <complex>
#include <iostream>

template<class T, class U>
struct castable_complex : std::complex<T>
{
    castable_complex() = default;
    castable_complex(T real, T imag) : std::complex<T>(real, imag) {}
    // more constructed needed I guess...

    operator std::complex<U>() const
    {
        return { static_cast<U>(this->real()), static_cast<U>(this->imag()) };
    }
};

int main()
{
    auto z = castable_complex<double, int> { 3.14, 1.618 };
    auto w = static_cast<std::complex<int>>(z);
    std::cout << "w = " << w.real() << " + i." << w.imag() << "\n";
}

演示:http://coliru.stacked-crooked.com/a/c38fe81c92d8664e

答案 2 :(得分:1)

最简单的是专门研究Eigen::internal::cast

template<>
inline std::complex<double> cast(const std::complex<short>& x) {
  return std::complex<double>(std::real(x),std::imag(x));
}

演示here