5

移植性と保守性を最大化するために、および他の TR1/BOOST C++0x テンプレートとautoconf組み合わせて使用​​するためのベスト プラクティスは何ですか?shared_ptr

がおよび/またはとして利用可能autoconfかどうかを判断できます。同じ機能に 2 つの異なる名前があることを考えると、次の質問があります。shared_ptrstd::tr1::shared_ptrboost::shared_ptr

  1. コードでは、どのshared_ptrように参照する必要がありますか?
  2. std::tr1::shared_ptrよりも優先する必要がありboost::shared_ptrますか?

shared_ptrまず、コードは現在、プリプロセッサ条件を使用して、への非修飾参照を許可しています。

#if HAVE_STD_TR1_SHARED_PTR
using std::tr1::shared_ptr;
#elif HAVE_BOOST_SHARED_PTR
using boost::shared_ptr;
#else
#error "No definition for shared_ptr found"
#endif

次に、コードはstd::tr1::overboost::を使用して、外部ライブラリへの依存を最小限に抑えます (ライブラリが広く使用されている場合でも)。

これらの 2 つのソリューションは一般的ですか? より良いものはありますか?

4

1 に答える 1

3

サンプルコードの改善点の1つであり、最初の質問に対する答えは、「templatetypedef」イディオムを使用することです。

#if HAVE_STD_TR1_SHARED_PTR
    template <class T>
    struct SharedPtr {
        typedef std::tr1::shared_ptr<T> Type;
    };
#elif HAVE_BOOST_SHARED_PTR
    template <class T>
    struct SharedPtr {
        typedef boost::shared_ptr<T> Type;
    };
#else
#   error "No definition for shared_ptr found"
#endif

// Declare a shared_ptr using our wrapper classes, saving us from having to care
// where shared_ptr comes from:
SharedPtr<int>::Type my_shared_int(new int(42));

これに関する主な問題は、::Type表記を使用する必要があることです。これは純粋に、C++には現在テンプレートのtypedefを持つ方法がないためです。テンプレート型インスタンスのtypedefを持つことができますが、ここでは汎用性を維持することが重要です。

ブーストよりもTR1を好むべきかどうかについては、そうだと思います。コンパイラが部分的なC++0xサポートとともに出荷されているので、std :: shared_ptrもテストし、他のいずれよりもテストする必要があると思います。

別の場所にあるshared_ptrを持つコンパイラがある場合は、4番目のtypedefが必要になることがあります。slistそのようなコンパイラについては知りませんが、私が維持しているC ++コードの中には、単一リンクリストの標準C++ライブラリの一般的な拡張機能であなたが求めているものと似たようなものを実行するものがあります。古いg++バージョンではグローバル名前空間に配置され、最新のg ++​​ではコンパイラ固有の__gnu_cxx名前空間に配置され、誤って配置されたものも見つかりましたstd

于 2010-05-30T03:45:13.457 に答える