static_cast 复杂<short> 到 c++ 中的复杂<double>
static_cast complex<short> to complex<double> in c++
我想使用 static_cast 将复数 < short > 转换为复数 < double >。
我正在尝试做与此 post 相同的事情,但我需要使用 static_cast。我不能使用该解决方案的原因是因为我正在使用在其 cast() 函数中使用 static_cast 的 Eigen。有没有办法扩展 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> >();
恐怕我没有得到启发性的答案。您可以扩展 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";
}
如果没有 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()) };
}
最简单的就是专精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.
我想使用 static_cast 将复数 < short > 转换为复数 < double >。
我正在尝试做与此 post 相同的事情,但我需要使用 static_cast。我不能使用该解决方案的原因是因为我正在使用在其 cast() 函数中使用 static_cast 的 Eigen。有没有办法扩展 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> >();
恐怕我没有得到启发性的答案。您可以扩展 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";
}
如果没有 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()) };
}
最简单的就是专精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.