次のコードを検討してください
#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
これを行う動機は次のとおりです。
二重小数点と固定小数点の両方で実装する必要があるアルゴリズムがあります。1 つの解決策は、ヘッド ファイルを使用して、マクロ フラグに基づいてデータ型を定義することです。たとえば、
#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 つの実装を比較できないことです。それに応じてマクロを 2 回設定し、2 回コンパイルして 2 回実行し、収集したデータを比較する必要があります。理想的には、非型パラメーターを持つテンプレート関数またはテンプレート クラスが必要です。これにより、実装を切り替えることができます。
同様の目標を達成できる他の方法 (実行時に 2 つの実装を比較する) も大歓迎です!
ありがとう