1

次のように使用するベクトルクラスを選択するための前処理コードがあります。

#define USE_BOOST_VECTOR

#ifdef USE_BOOST_VECTOR
    #include <boost/container/vector.hpp>
    #define VECTOR boost::container::vector
#else
    #include <vector>
    #define VECTOR std::vector
#endif

これが良い方法かどうかはわかりません。そして、選択できるオプションがもっとある場合はどうすればよいですか?

より多くのオプションがあるかどうかを把握しました

#define USE_MY_VECTOR 1
#define USE_BOOST_VECTOR 2
#define USE_STD_VECTOR 3

#define CHOOSE_VECTOR USE_BOOST_VECTOR

#if CHOOSE_VECTOR == USE_MY_VECTOR
    #include "Vector.h"
    #define VECTOR Vector
#elif CHOOSE_VECTOR == USE_BOOST_VECTOR 
    #include <boost/container/vector.hpp>
    #define VECTOR boost::container::vector
#elif CHOOSE_VECTOR == USE_STD_VECTOR
    #include <vector>
    #define VECTOR std::vector
#endif

しかし、より多くのオプションについては、1、2、3などを定義する必要があります。脳の働きのためだけに、もっと良い方法はありますか?

4

2 に答える 2

2

他に選択肢がない場合を除いて、プリプロセッサマクロを使用しないでください。typedef、定数、そして本当に必要な場合は、テンプレートは通常、意図した結果を得ることができますが、はるかに安全です。

さて、std :: vectorよりもBoostベクトルを好む本当に正当な理由がない限り、std::vectorを使用してください。なんで?何が必要かわからない場合は、std名前空間が提供するもので十分です。

編集:leemesが言うように、テンプレート化されたタイプのエイリアスを利用するにはC++11が必要です。

#define USE_BOOST_VECTOR

#ifdef USE_BOOST_VECTOR
    #include <boost/container/vector.hpp>
    template <typename T> using VECTOR = boost::container::vector<T>;
#else
    #include <vector>
    template <typename T> using VECTOR = std::vector<T>;
#endif

// ....
// You could then use it with
VECTOR<int> vec;

最後に、テンプレート化されたtypedefエイリアスに関する詳細情報を次に示します。

C ++ 11コンパイラがない場合は、名前空間エイリアスを使用できます。

#define USE_BOOST_VECTOR

#ifdef USE_BOOST_VECTOR
    #include <boost/container/vector.hpp>
    namespace Container = boost::container;
#else
    #include <vector>
    namespace Container = std;
#endif

//And use it with...
Container::vector<int> vec;

また、ここで追加する必要があります。上記の方法は、非常に紛らわしい結果につながる可能性があります。基本的に、どのベクトル実装を使用するかを事前に決定し、プリプロセッサマクロを完全に削除することを強くお勧めします。あなたのコードは時間の経過とともにあなたに感謝します:)

于 2013-02-01T01:09:48.377 に答える
0

プリプロセッサは、使用している目的とはまったく異なる目的を果たすため、これは悪い考えです。具体的には、作業している言語を拡張するために使用されます。これは、言語のコマンドのエイリアスを作成するような単純なものから、オブジェクトの追加など、言語に新しいセマンティック構造を追加するような複雑なものまであります。手続き型言語への指向プログラミング機能。いずれにせよ、コンパイル時にプログラムにロードするクラスライブラリを選択することではありません。私の提案は、インターフェイスクラスを作成してから、このクラスから2つのクラスを継承させることです。1つのクラスはブーストベクトルのラッパーとして機能し、もう1つのクラスはstd::vectorのラッパーとして機能します。このようにして、コンパイル時に(静的に)実装を選択できるだけでなく、

詳細については、次のリンクを参照してください 。OOPの適切な説明

于 2013-02-01T01:56:28.983 に答える