具有多个模板参数的模板专业化

Mar*_*rkP 5 c++ templates template-specialization

说我有这个:

template<typename T, int X>
class foo 
{
public:
  void set(const T &t);
};

template<typename T, int X>
void foo::set<T, X>(const T &t)
{
  int s = X;
  // ...etc
}
Run Code Online (Sandbox Code Playgroud)

我可以将函数类型'T'专门化,但是将'X'作为模板参数吗?

class bar;

template<int X>
void foo::set<bar, X>(const bar &t)
{
  int s = X;
  // ...etc
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Joh*_*itb 6

一旦掌握了它,这就非常容易了

template<typename T, int X>
class foo 
{
private:
  template<typename, int> class params { };

public:
  void set(const T &t) {
    set(t, params<T, X>());
  }

private:
  template<typename T1, int X1>
  void set(const T1 &t, params<T1, X1>) {
     // ...
  }

  template<int X1>
  void set(const bar &t, params<bar, X1>) {
    // ...
  }
};
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为如果您明确地专门化单个成员,则必须提供所有模板参数.你不能留下一些.