加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 根据枚举调用适当的函数,但使用模板

发布时间:2020-12-16 09:49:30 所属栏目:百科 来源:网络整理
导读:我有这个包装函数,应该根据它包含的数据类型调用大型数据集上的相应函数,如下所示: void WrapperFunc( int iRealDataType,int iUseAsDataType ){ // now call the right function based on both arguments switch ( iRealDataType ) { case FancyType1: swi
我有这个包装函数,应该根据它包含的数据类型调用大型数据集上的相应函数,如下所示:

void WrapperFunc( int iRealDataType,int iUseAsDataType )
{
    // now call the right function based on both arguments
    switch ( iRealDataType )
    {
          case FancyType1:
          switch ( iUseAsDataType )
          {
               case CoolType1: DataAnalysisFunc_Fancy1_Cool1(); break;
               // etc.
          }
          // etc.
    }
}

到目前为止,这是通过使用两个嵌套的switch语句然后为Real和UseAs数据类型的每个现有组合调用许多专用函数之一来解决的.但是,随着定义类型数量的增加,维护代码库是一场噩梦.所以我决定最终使用模板.如果可以的话,我主要是避开它们,但这次它们很适合这个问题.

所以现在我要调用DataAnalysisFunc< FancyType1,CoolType1>而不是DataAnalysisFunc_Fancy1_Cool1. ang摆脱了数百行switch语句,但我不能像这样使用它,因为FancyType1是枚举,而不是类型(例如Fancy1).

只是为了澄清 – 我知道这听起来像是一个愚蠢的人为例子,但我试图尽可能地简化问题以找到它的核心,而不是解释大量的细节,这将进入一个更具体的例子.

编辑:我的数据分析功能实际上是CUDA内核 – 这可能会排除一些可能的解决方案.对不起.

解决方法

模板听起来像错误的解决方案.你想要的是一个查找表.

typedef void (*DataAnalysisFunc)();
const DataAnalysisFunc DataAnalysisFunctions[NumFancyTypes][NumCoolTypes] = {
  /*Fancy1*/ {
    /*Cool1*/ &DataAnalysisFunc_Fancy1_Cool1,/*Cool2*/ &DataAnalysisFunc_Fancy1_Cool2 }
  /*Fancy2*/ {
    /*Cool1*/ &DataAnalysisFunc_ImpossibleCombination,// can't happen,throw or something
    /*Cool2*/ &DataAnalysisFunc_Fancy2_Cool2 }
};

void WrapperFunc(int realDataType,int useAsDataType) {
  assert(realDataType >= 0 && realDataType < NumFancyTypes);
  assert(useAsDataType >= 0 && useAsDataType < NumCoolTypes);
  (*DataAnalysisFunctions[realDataType][useAsDataType])();
}

现在,如果这些DataAnalysisFunc共享大量代码,模板可能会帮助您,但不能用于动态分派.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读