ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

专注于C模板中的类型子集

2019-08-27 00:15:03  阅读:196  来源: 互联网

标签:specialization c templates


我对C中的模板专业化有疑问,我希望有人可以提供帮助.我有一个有3个模板参数的类:

template<class A, class B, class C>
class myClass {

public:
  void myFunc();
};

我想要做的是写几个版本的myFunc,专门用于比如C,但是对于类型A和B是通用的.所以我不想要这样的完全模板化的函数:

template<class A, class B, class C>
void myClass<A, B, C>::myFunc()
{
  // function code here
}

我不想要像这样的完全专业化的功能

void myClass<int, int, int>::myFunc()
{
  // code goes here
}

相反,我想做一些类似的事情

template<class A, class B>
void myClass<A, B, int>::myFunc()
{
  // code goes here
}

我的想法是,如果类类型C是int,我会调用myFunc()的一个版本,如果类类型C是double,我会调用不同版本的myFunc.我已经尝试了许多模板特化语法的差异组合(这里列出的太多了),似乎没有编译.

有人可能会指出我在正确的方向吗?在此先感谢您的帮助.

迈克尔

解决方法:

您可以编写函数模板和重载,并将工作委托给它:

template<class A, class B, class C>
class myClass 
{
   //resolver doesn't need to define anything in it!
   template<class> struct resolver {}; //empty, yet powerful!
public:
  void myFunc() 
  {
       doFun(resolver<C>());
  }

  //this is a function template
  template<typename X>
  void doFun(const resolver<X> & )
  {
      //this function will get executed when C is other than int
      //so write your code here, for the general case
  }

  //this is an overload, not a specialization of the above function template!
  void doFun(const resolver<int> & ) 
  {
      //this function will get executed when C = int
      //so write your code here, for the special case when C = int
  }
};

请注意一点:doFun(const resolve< int>&)是一个重载函数,它不是函数模板的特化.如果不专门化封闭类模板,则无法专门化成员函数模板.

阅读这些文章:

> Template Specialization and Overloading
> Why Not Specialize Function Templates?

标签:specialization,c,templates
来源: https://codeday.me/bug/20190827/1735437.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有