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

これを行う動機は次のとおりです。

二重小数点と固定小数点の両方で実装する必要があるアルゴリズムがあります。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 つの実装を比較する) も大歓迎です!

ありがとう

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 に答える