static_cast complex <short>to complex <double>в c ++ - PullRequest
0 голосов
/ 05 июля 2018

Я хотел бы использовать static_cast для преобразования сложного в сложное .

Преобразовать комплекс в комплекс

Я пытаюсь сделать то же самое, что и в этом посте, но мне нужно использовать static_cast. Причина, по которой я не могу использовать это решение, заключается в том, что я использую Eigen, который использует static_cast в своей функции cast (). Есть ли способ расширить функциональность static_cast для преобразования таким образом? Или есть способ расширить функцию cast () Eigen для обработки этого преобразования?

Это в основном то, что я пытаюсь:

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 голосов
/ 05 июля 2018

Я бы сделал это без функции 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()) };
}
0 голосов
/ 05 июля 2018

Проще всего специализироваться Eigen::internal::cast:

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

Демо здесь .

0 голосов
/ 05 июля 2018

Боюсь, у меня нет просветляющего ответа. Вы можете расширить 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

...