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共享大量代码,模板可能会帮助您,但不能用于动态分派. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |