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

时间:2011-10-04 04:36:13

标签: 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
}

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

class bar;

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

这可能吗?

4 个答案:

答案 0 :(得分: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>) {
    // ...
  }
};

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

答案 1 :(得分:3)

您可以考虑重写代码以使成员函数成为单独的模板:

template <int X> class foo
{
  template <typename T> void set(const T &);
  // ...
};

然后,您可以为模板foo<X>::set提供明确的专业化。

答案 2 :(得分:2)

没有。这是不允许的。 class成员函数必须完全专业化。例如,它应该是,

template<>
void foo<bar, 5>::set(const bar &t)
{          //^^^^
  int s = 5;
  // ...etc
}

答案 3 :(得分:1)

您可以对整个班级进行部分专业化。在这种情况下,您可以为类的每个特化提供set函数的不同实现。