C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 根据枚举调用适当的函数,但使用模板大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这个包装函数,应该根据它包含的数据类型调用大型数据集上的相应函数,如下所示:

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共享大量代码,模板可能会帮助您,但不能用于动态分派.

大佬总结

以上是大佬教程为你收集整理的c – 根据枚举调用适当的函数,但使用模板全部内容,希望文章能够帮你解决c – 根据枚举调用适当的函数,但使用模板所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。