Рассмотрим следующий код
#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;
Недостаток этого типа решения заключается в том, что вы не можете сравнить две реализации во время выполнения. Вы должны соответственно установить макрос дважды, дважды скомпилировать и запустить дважды, а затем сравнить собранные данные. В идеале я хотел бы иметь шаблонную функцию или шаблонный класс с нетиповым параметром, который позволяет мне переключаться между реализациями
Любая другая методология может достичь аналогичной цели (сравнение двух реализаций во время выполнения) также приветствуется!
Спасибо
Вы можете специализировать шаблоны для отдельных реализаций. Шаблонные специализации могут быть сделаны и для классов. Рассматривать:
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
}
Но он принимает параметр в функцию вместо аргумента шаблона.
Других решений пока нет …