2

考虑以下代码

#include <iostream>
using namespace std;

template<int I>
int myfunc()
{
#if I
    return 1; 
#else
    return 2;
#endif
};

int main()
{
    cout<<myfunc<0>()<<endl;
    cout<<myfunc<1>()<<endl;
}

但输出是

2
2

这样做的动机如下:

我有一个算法,需要在双点和定点中实现。一种解决方案是使用头文件根据宏标志定义数据类型,例如,

#ifdef __DOUBLE__
typedef double InputType;
.... // a lot of other types
typedef double OutputType;
#else  //Fixed Point
typedef int InputType;
... // a lot of other types, which are matching with "__DOUBLE__" section
typedef int OutputType;

这种解决方案的缺点是您无法在运行时比较两种实现。您必须相应地设置宏两次,编译两次,运行两次,然后比较收集的数据。理想情况下,我希望有一个带有非类型参数的模板函数或模板类,它允许我在实现之间切换

任何其他可以实现类似目标的方法(在运行时比较两个实现)也是受欢迎的!

谢谢

4

1 回答 1

3

选项:模板专业化

您可以专门化模板以允许单独的实现。模板专业化也可以用于类。考虑:

template<typename T>
void foo(T) {
  //general implementation
}

template<>
void foo(double d) {
  //do something special for doubles
}

template<>
void foo(float f) {
  //do something else for floats
}

选项:类型枚举

这类似于OpenGL。像这样的东西:

enum MyTypes {FLOAT, DOUBLE};

void foo(MyType _m) {
  //do some generic stuff
  switch(_m) {
    case FLOAT:
      //do something for float
      break;
    case DOUBLE:
      //do something else for float
      break;
    default:
      //runtime error
  }
  //do some other stuff
}

但它在函数中接受参数而不是模板参数。

于 2013-10-22T20:42:56.957 回答