在提供`T = std :: complex <Q>`时如何避免嵌入`std :: complex`?

Adr*_*ire 6 c++ templates complex-numbers c++11

对于多项式方程求解器,将其模板化以使任何类型可用是很好的:

template <class number, int degree>
class PolynomialEquation
{
public:

private:
    array<number, degree+1> myEquation;
    array<complex<number>, degree> equationResult;
};
Run Code Online (Sandbox Code Playgroud)

例如,这允许double在ℝ中用于输入,并且结果std::complex<double>在ℂ中(我们知道从2级及以上,方程的解通常落入ℂ,例如:x ^ 2 + 1).

但是,等式的输入也可以是a std::complex.在这种情况下,类型myEquation应该是复杂的,但equationResult不应该是a std::complex<complex<T>>,而只是正常的复数类型T.

问题:

如何在提供方程时使类型equationResult成为子类型?std::complexstd::complex

是否有std::is_floating_point类似std :: is_complex_number 的等价物?

Jar*_*d42 7

您可以创建一个特征,例如:

template <typename T>
struct to_complex {
    using type = std::complex<T>;
};

template <typename T>
struct to_complex<std::complex<T>> {
    using type = std::complex<T>;
};
Run Code Online (Sandbox Code Playgroud)

然后

template <class number, int degree>
class PolynomialEquation
{
public:

private:
    array<number, degree+1> myEquation;
    array<typename to_complex<number>::type, degree> equationResult;
};
Run Code Online (Sandbox Code Playgroud)