嵌套模板专用化

Nested Template Specialization

本文关键字:专用 嵌套      更新时间:2023-10-16

我有一个模板化类,当模板参数与类的类型相同时,需要一个专门的构造函数。 下面的代码无法编译。

当类型为 Dual 时,指定使用特定构造函数的正确语法是什么? 特别是,当模板参数的类型为 Dual 时,我需要初始化初始值设定项列表中的成员"real",但当它不是(例如双精度类型)时,则不需要。

template<class X> class Dual {
 public:
  X real;
  size_t N;
  std::vector<X> imag;//don't know N at compile time

  Dual(size_t _N);
};
template <class X>
inline Dual<X>::Dual(size_t _N):  N(_N), imag(N, 0.0)  {}
template <class X>
inline Dual<Dual<X> >::Dual(size_t _N): real(_N), N(_N), imag(_N, 0.0) {}
//syntax error:  
//error: cpptest.cpp:20:24: error: C++ requires a type specifier for all declarations
//inline Dual<Dual<X> >::Dual(size_t _N): real(_N), N(_N), imag(_N, 0.0) {}
//~~~~~~ 

int main(){
  Dual <double> a(5);
  Dual< Dual < double>> b(5);
}

您可以为构造函数提供可选的第二个参数来初始化real

template<class X> class Dual {
public:
  X real;
  size_t N;
  std::vector<X> imag;
  Dual(size_t _N, X x = X());
};
template <class X>
inline Dual<X>::Dual(size_t _N, X x):  real(x), N(_N), imag(N, 0.0)  {}

现在,当您拥有特殊Dual时,您可以通过传入"原型"来按照您想要的方式对其进行初始化。

Dual<double> a(5);
Dual< Dual<double> > b(5, a);

优点是您只需声明一个template。但是,如果您为 Dual< Dual<X> > 创建专用化,那么您可以像尝试的那样定义构造函数(除了初始化错误的imag,并在下面更正)。

// Specialize Dual<T> in the case T is a Dual<X>
template <class X> class Dual< Dual<X> > {
public:
    Dual<X> real;
    size_t N;
    std::vector< Dual<X> > imag;
    Dual(size_t _N);
};
template <class X>
inline Dual< Dual<X> >::Dual(size_t _N)
    : real(_N), N(_N), imag(N, Dual<X>(_N)) {}

不能提供包含构造函数的非类型模板的部分专用化。