【发布时间】:2022-01-16 03:03:21
【问题描述】:
我正在查看 C++ 标准库的 <complex> 实现。我注意到对于所有当前的 GNU、LLVM 和 MSVC 实现,对于类型 float double 和 long double 的模板特化存在大量代码重复,但我不知道为什么。
以https://github.com/microsoft/STL/blob/main/stl/inc/complex的MSVC代码为例,考虑类模板及其特化
template <class _Ty>
class complex;
template <>
class complex<float>;
template <>
class complex<double>;
template <>
class complex<long double>;
通用类模板中已有定义。以operator*=的一个定义为例,
template <class _Ty>
class complex : public _Complex_base<_Ty, _Complex_value<_Ty>> {
public:
// ...
_CONSTEXPR20 complex& operator*=(const _Ty& _Right) {
this->_Val[_RE] = this->_Val[_RE] * _Right;
this->_Val[_IM] = this->_Val[_IM] * _Right;
return *this;
}
// ...
};
为什么floatdouble和long double的特化中的几乎所有成员函数都会一次又一次地重复这种代码,如下所示?
template <>
class complex<double> : public _Complex_base<double, _Dcomplex_value> {
public:
// ...
_CONSTEXPR20 complex& operator*=(const _Ty& _Right) {
_Val[_RE] = _Val[_RE] * _Right;
_Val[_IM] = _Val[_IM] * _Right;
return *this;
}
// ...
};
std::complex<T> 的模板特化中出现这种代码重复的原因是什么?
供参考,在上面的MSVC代码中,是
using _Dcomplex_value = _CSTD _C_double_complex;
作为参考,<complex> 的 GNU 实现可以在 https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/complex 找到
作为参考,<complex> 的 LLVM 实现可以在 https://github.com/llvm/llvm-project/blob/main/libcxx/include/complex 找到
作为参考,<complex> 的 MSVC 实现可以在https://github.com/microsoft/STL/blob/main/stl/inc/complex 的 MSVC 代码中找到
【问题讨论】:
-
我认为
_Dcomplex_value与_Complex_value<double>在某些方面不同 -
在他们的 github 网站上打开一个问题并询问实际作者不是更好吗?
-
看来
_C_double_complex由complex.h的C 库实现共享,也许共享结构确保C++std::complex<double>和Cdouble complex是ABI 兼容的。
标签: c++ templates template-specialization c++-standard-library