0

テンプレートを使用するコードがいくつかあるので、float、real、double を切り替えて、計算の精度やメモリを節約できます。ここで、ユーザーが実行ごとに精度を選択できるようにしたいのですが、どうすればよいかわかりません。

私のmain.cppで言ってみましょう

// main.cpp
Object<double> obj;
obj.doSomething();

使用されるタイプを「設定」する方法はありますか? 次のようなものですか?

//main.cpp

std::cout << "Choose Precision ": << std::endl;
std::cin  >> PRECISION; // eg float or double

? fix precision and use generic code below with it ?

Object<PRECISION> obj; 

obj.doSomething();

アップデート

実行時にできないことは明らかです。ありがとう。

異なる精度でコードをコンパイルするために編集する行が 1 行だけになるように、メインで一般的なテンプレート化されたコードを引き続き使用できますか?

Kevin Cadieux が回答した更新:typedef double MyPrecision;

4

3 に答える 3

4

いいえ、テンプレートはコンパイル時に機能するため、実行時に型を変更しようとしています。これを行いたい場合は、継承とポリモーフィズムを使用する必要があります。

于 2013-10-06T08:43:22.397 に答える
4

実行時にテンプレートのタイプを設定することはできませんが、使用するテンプレートの特殊化を選択できます。例えば:

template <typename T>
void doStuff<T>()
{
  Object<T> obj;
  // do something with obj
}

int main()
{
  // same PRECISION getting code
  switch (PRECISION) {
  case (x) :
    doStuff<double>();
    break;
  case(y) :
    doStuff<float>();
    break;
  ....
}
于 2013-10-06T08:44:13.860 に答える
1

簡単に言えば、いいえ。テンプレートのインスタンス化はコンパイル時に発生します。PRECISION 変数は実行時にのみ認識されるため、それを使用してテンプレートをインスタンス化することはできません。

John が言ったように、このような場合 (および実行時の条件に基づいてのみ動作が既知であるその他の場合) には、ポリモーフィズムを使用するのが最も適しています。

おそらく、次のようなクラス階層を持つことができます。

class SomePrecisionBase
{
    virtual double compute() = 0;  //Or whatever
};

class MySuperPreciseClass
{
    virtual double compute(); //Super precise computation
};

class MyNotSoPreciseClass
{
    virtual double compute(); //Not so precise computation
};

次に、 からのユーザー入力を使用して正しいクラスを構築するために、std::cinおそらく次のようなファクトリ関数を作成する必要があります。

SomePrecisionBase* factory(int precision)
{
    //Construct a concrete class here and return it as a SomePrecisionBase pointer
    //Also consider using an std::shared_ptr instead of a raw pointer
}

編集

しかし、倍精度浮動小数点計算と単精度浮動小数点計算のどちらかを選択したいだけの場合、これは明らかに奇妙です。その場合、私はジャンチョパンザのアプローチを好みます。

または、コードのどこかに次のような typedef を含めることもできます。

typedef double MyPrecision;

コンパイル時に決定したい場合は、MyPrecision を使用してテンプレートをインスタンス化し、気が変わった場合に変更する場所を 1 つだけにすることができます。

于 2013-10-06T08:52:30.243 に答える