在C++中专门化它时调用非特定版本的函数?

Jac*_*b B 11 c++ templates template-specialization

说我有一个模板类:

template <typename T>
class foo {
  void do_someting(T obj) {
    // do something generic...
  }
};
Run Code Online (Sandbox Code Playgroud)

我想专门化do_something,但在其中我想调用"普通"do_something函数:

template<>
void foo<MyObj>::do_something(MyObj obj) {
  // do something specific...
  // and ALSO do something generic!
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在我的专用函数中引用do_something的正常版本?或者我只需要复制代码?

(我知道我可以用这样的方式重构foo,我不会遇到这个问题,但实际上我无法真正修改"真正的"foo,因为它是重度共享的代码.)

Ste*_*e M 7

不.您的专业化是MyObj类型参数的唯一定义.但是,请考虑以这种方式修改foo模板,这对模板的当前用户是透明的:

template<typename T>
class foo {
  void prelude(T &obj){ // choose a better name
    /* do nothing */
  }
  void do_something(T obj){
    prelude(obj);
    // do something generic...
  }
};
Run Code Online (Sandbox Code Playgroud)

然后为前奏定义一个专门化:

template<>
void foo<MyObj>::prelude(MyObj &obj){
  // do something specific
}
Run Code Online (Sandbox Code Playgroud)

这在结构上与私有虚拟成员主要用例有些相似.(排序.不是真的.但这是启发我的答案.)