Шаблоны C ++ и макрос предварительной обработки

Рассмотрим следующий код

#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;

Недостаток этого типа решения заключается в том, что вы не можете сравнить две реализации во время выполнения. Вы должны соответственно установить макрос дважды, дважды скомпилировать и запустить дважды, а затем сравнить собранные данные. В идеале я хотел бы иметь шаблонную функцию или шаблонный класс с нетиповым параметром, который позволяет мне переключаться между реализациями

Любая другая методология может достичь аналогичной цели (сравнение двух реализаций во время выполнения) также приветствуется!

Спасибо

2

Решение

Опция: специализация шаблона

Вы можете специализировать шаблоны для отдельных реализаций. Шаблонные специализации могут быть сделаны и для классов. Рассматривать:

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
}

Но он принимает параметр в функцию вместо аргумента шаблона.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]