我编写了一个适用于 double 和 std::complex 的模板类。正如它所设想的那样,我所有的方法都在 .hpp 文件中。除了一个。我必须专门研究一种方法,因为在某些地方我必须计算 double 的平方或 std::complex 的范数。对于“双重特化”(A) 更明确:
double a(2.0);
double b(0.0);
b = a*a;
对于“复杂特化”(B):
std::complex<double> a(2.0,3.0);
double b(0.0);
b = std::norm(a);
我的问题是:
有没有一种方法可以通过使用同时适用于 double 和 complex 的函数来避免这些特化? (因为 std::norm 仅适用于复杂...)
或者唯一的解决方案是将特化 (A) 的双 a 转换为复数,然后仅使用特化 (B) 作为通用模板(同时适用于 double 和复数)?
最佳答案
您可以通过引入自己的函数作为方形/范数包装器来最小化发散情况:
template <typename T>
double square_or_norm(T x);
template<>
inline double square_or_norm(double x) { return x * x; }
template <>
inline double square_or_norm(std::complex<double> x) { return norm(x); }
然后,在需要它的函数中使用它:
template <typename T>
T computation(T x) {
return some_code_with(x, square_or_norm(x));
}
关于C++ template double std::complex<double> 范数和积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15783010/