1

入力変数に応じて、1 つのベクトルを実数または複素数として定義する必要があるアルゴリズムを開発しています。擬似は次のようになります

void foo(bool is_real)
{
  if (is_real)
  {
    vector< double > v; 
  }
  else vector< complex > v;
}

現在、私は 2 つの異なるバージョンのアルゴリズムを作成しています。is_real が true の場合は、実際のケースのアルゴリズムを使用し、それ以外の場合は複雑なケースを使用します。実際、データ型を除いて、両方のアルゴリズムはまったく同じです。だから私はそれをグーグルで検索し、

#if is_real
  vector< double > v;
#else
  vector< complex > v;
#endif

しかし、このコードはコンパイルされません。Linux gnu c++ 4.7.2 を使用しています。マクロは Microsoft C++ でしか機能しないのでしょうか? 私の実装では唯一の違いはデータ型であるため、快適ではありません。実行時に使用する型を選択する方法はありますか? ありがとう。

4

4 に答える 4

10

コードがまったく同じ場合は、テンプレートにします。

namespace detail {
    template <typename T>
    void foo() {
        vector<T> v;
        // blah
    }
}

void foo(bool is_real)
{
  if (is_real)
  {
    detail::foo<double>();
  }
  else detail::foo<complex>();
}
于 2013-08-05T08:31:28.047 に答える
1

C++ テンプレートは、コンパイル時にその型を認識する必要があります。最初の例では、型は実行時に定義されますが、これはかなり静的な言語である C++ では許可されていません。2 番目の例は、コンパイル時の条件を使用しているため、問題ありません。

于 2013-08-05T08:34:52.157 に答える
1

マクロはプリプロセッサによって使用されます。これはコンパイル時の命令です。実行時に使用することはできません。何かを定義し、コンパイル中に実数または複素数を操作していることをコンパイラに知らせることを前提としています。

テンプレートを使用できますが (提案されているように)、1 か所で初期化してからベクターを引き続き使用する場合は、いくつかのオプションがあります。

  1. 継承を使用して基本クラスのベクトルを操作する
  2. 2 つのベクトルを持ち、1 つのみで動作します (入力によって異なります)。
  3. 実数を複素数として内部に格納します。ちょっと無駄ですけどね。
于 2013-08-05T08:39:44.043 に答える
0

あなたが達成しようとしていることは、オプションis_realを使用してコンパイル時に行うことができます-Dis_real

実行時に、次のようなものを持つことができます:

template<typename T>
class MyAlgorithm
{
    public:

    MyAlgorithm(/*...*/ )
    {
        /*Your initialization routine */
    }

     /* copy constructor
     copy assignment operator */

    ~MyAlgorithm(/*...*/){ /*...Other deallocation stuffs...*/ }

    private:
        std::vector<T> vec;
};

int main ()
{

    MyAlgorithm<double> m;
    MyAlgorithm<std::complex<double> > n;

      return 0;
}
于 2013-08-05T08:43:26.063 に答える