8

C++0x、C++03 TR1 とブーストの間で、関数やバインドなどのいくつかのものは、コンパイラに応じて 3 つの異なる場所で定義できます。 std::tr1:: 名前空間で、VC10 はそれを std:: 名前空間だけに移動します。

現在、私の既存のコードは、boost:: 名前空間で古いバージョンのブーストを排他的に使用していますが、私のアプリケーションとライブラリの多くで、使用したすべてのブーストは現在 tr1 と C++0x にあるため、可能であればブーストの依存関係を削除したいと考えています古いバージョンのコンパイラとの下位互換性を維持しながら、それらから。

ただし、コードを見つけてインクルードし、正しいバージョンにアクセスできるようにする方法がわかりません:(私が検討したことの1つは、_MSC_VERのようなマクロを使用して、必要なクラスがコンパイラに含まれているかどうかを確認することです(フォールバックtr1 に移動し、必要に応じてブーストする)、「using somenamespace::someclass;」を使用して、問題のクラスを std:: 名前空間に移動します。

問題は、場合によってはこれが壊れる可能性があることです.VC9に機能パックまたはSP1がインストールされているかどうかを確認する方法さえわかりません:(それを行うためのきちんとした方法についてもわかりません、おそらく必要な「魔法」を行う独自のfunctional.hppを提供しますか?

主なことは、新しい標準用のコードを書き始めたいということですが、古いコンパイラでも最小限の労力で動作するようにします。

4

3 に答える 3

8

ブーストTR1は既にこれを行っています。プラットフォームで利用可能な場合はコンパイラの TR1 実装を使用するためのコンパイラ/バージョン検出ロジックがあり、そうでない場合はさまざまな関連する Boost ライブラリを使用して TR1 をエミュレートします。

このライブラリ自体は TR1 コンポーネントを実装するのではなく、標準ライブラリの TR1 実装 (存在する場合) をインクルードするシン ラッパーですstd::tr1

于 2011-03-02T01:08:08.200 に答える
3

あなたの投稿から、あなたは主にVC++について心配しているようです。その場合は、に基づいてプリプロセッサ定義を使用するの_MSC_VERがおそらく最も簡単な解決策だと思います。あなたがほのめかしたように、さまざまな機能を提供するために最初にどのバージョンがあったかを調べて、適切なヘッダーを含めてください。

コードでそれらにアクセスする方法typedefに関しては、含まれているヘッダーに応じて異なるタイプに設定されているいくつかのを使用します。ライブラリのboost、tr1、およびC ++ 0xバージョンが同じ(または十分に類似した)インターフェイスを提供する場合、これは「正常に機能する」はずです。ただし、型がクラステンプレートの場合、プレーンなtypedefは機能しないため、#defineを使用する必要があります。

単純なことが良い場合もあります。複雑にしすぎる価値はないかもしれません。(VC ++以外のものをサポートしたい場合は、おそらく複雑になる必要があります。)

おそらくこのようなもの(最初の考えとして):

#ifdef _MSC_VER
  #if _MSV_VER >= VERSION_WITH_CXX0X
    #include <function>
    #define FUNCTION_NAMESPACE std
  #elif _MSV_VER >= VERSION_WITH_TR1
    #include <tr1/function>
    #define FUNCTION_NAMESPACE std::tr1
  #else
    #include <boost/function.hpp>
    #define FUNCTION_NAMESPACE boost
#else
  #error The current compiler is not supported.
#endif

void func();

FUNCTION_NAMESPACE::function<void ()> funcobj(func);

名前空間を取得するために#defineを使用するのは好きではありませんが、頭のてっぺんから別の方法を考えることはできません。でも、きっとあるでしょう。

于 2011-03-02T00:42:45.057 に答える
0

既に Boost を使用しているため、Boost.Config が提供するマクロを使用して、サポートされる可能性のある機能をテストすることを検討してください。具体的には、BOOST_HAS_TR1_*マクロとマクロを見てくださいBOOST_NO_*

TR1 および C++0x のすべての実装がこれらの仕様のすべての機能をサポートしているわけではないため、個々の機能を確認する必要があることに注意してください。

于 2011-03-02T01:01:19.160 に答える