如何仅特化模板类的某些成员?

发布于 2024-10-16 18:35:18 字数 455 浏览 8 评论 0原文

代码:

template<class T>
struct A {
  void f1() {};
  void f2() {};

};

template<>
struct A<int> {
  void f2() {};
};


int main() {
  A<int> data;
  data.f1();
  data.f2();
};

错误:

test.cpp: In function 'int main()':
test.cpp:16: error: 'struct A<int>' has no member named 'f1'

基本上,我只想专门化一个函数并使用其他函数的通用定义。 (在实际代码中,我有很多我不想专门研究的函数)。

如何做到这一点?谢谢!

Code:

template<class T>
struct A {
  void f1() {};
  void f2() {};

};

template<>
struct A<int> {
  void f2() {};
};


int main() {
  A<int> data;
  data.f1();
  data.f2();
};

ERROR:

test.cpp: In function 'int main()':
test.cpp:16: error: 'struct A<int>' has no member named 'f1'

Basically, I only want to specialize one function and use the common definition for other functions. (In actual code, I have many functions which I don't want to specialize).

How to do this? Thanks!

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

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

发布评论

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

评论(3

七禾 2024-10-23 18:35:18

这会有所帮助吗:

template<typename T>
struct A
{
  void f1()
  {
    // generic implementation of f1
  }
  void f2()
  {
    // generic implementation of f2
  }
};

template<>
void A<int>::f2()                                                               
{
  // specific  implementation of f2
}

Would this help:

template<typename T>
struct A
{
  void f1()
  {
    // generic implementation of f1
  }
  void f2()
  {
    // generic implementation of f2
  }
};

template<>
void A<int>::f2()                                                               
{
  // specific  implementation of f2
}
坏尐絯℡ 2024-10-23 18:35:18

考虑将公共部分移至基类:

template <typename T>
struct ABase
{
    void f1();
};


template <typename T>
struct A : ABase<T>
{
    void f2();
}  


template <>
struct A<int> : ABase<int>
{
    void f2();
};

您甚至可以在派生类中重写f1。如果您想做一些更奇特的事情(包括能够从基类中的 f1 代码调用 f2),请查看 CRTP

Consider moving common parts to a base class:

template <typename T>
struct ABase
{
    void f1();
};


template <typename T>
struct A : ABase<T>
{
    void f2();
}  


template <>
struct A<int> : ABase<int>
{
    void f2();
};

You can even override f1 in the derived class. If you want to do something more fancy (including being able to call f2 from f1 code in the base class), look at the CRTP.

贱贱哒 2024-10-23 18:35:18

当我们声明模板类的特化时,我们还必须定义它的所有成员,甚至是那些与通用模板类完全相同的成员,因为没有从通用模板到特化的成员继承。因此,在您的专业化中,您也必须实现 void f1();

When we declare specializations for a template class, we must also define all its members, even those exactly equal to the generic template class, because there is no inheritance of members from the generic template to the specialization. So, in your specialization you have to implement void f1(); too.

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