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

发布于 2024-12-07 18:54:19 字数 417 浏览 0 评论 0原文

假设我有这个:

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
}

这可能吗?

Say I have this:

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
}

Could I specialize the function type 'T' but leave 'X' as a template parameter?

class bar;

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

Is this possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

无需解释 2024-12-14 18:54:20

一旦掌握了窍门,这就会非常容易。

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>) {
    // ...
  }
};

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

This is surprisingly easy once you get the hang of it

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>) {
    // ...
  }
};

This is necessary because if you explicitly specialize a single member, you must provide all template arguments. You cannot leave some off.

淡看悲欢离合 2024-12-14 18:54:20

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

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

然后您可以为模板 foo::set 提供显式特化。

You could consider rewriting your code to make the member function a separate template:

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

Then you can provide explicit specializations for the template foo<X>::set.

无戏配角 2024-12-14 18:54:20

不,这是不允许的。 成员函数必须完全专门化。例如,应该是,

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

No. That is not allowed. A class member function must be fully specialized. For example, it should be,

template<>
void foo<bar, 5>::set(const bar &t)
{          //^^^^
  int s = 5;
  // ...etc
}
和影子一齐双人舞 2024-12-14 18:54:20

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

You can partially specialize the whole class. In this case you can give different implementations to the set function for every specialization of the class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文