2012-06-04 24 views
8

質問のタイトルが適切かどうかわかりません。ここに問題があります。私はいくつかのC + + 11ライブラリ機能を使用するライブラリを書いています。すべての実装がまだこれらのライブラリをサポートしていないことは明らかです。したがって、移植性の問題があります。どのライブラリがここで問題になるかは問題ではありません。 1つの解決策は、既に多くのC++ 11ライブラリを提供するboostを使うことです。だから私の解決策は、マクロを定義することです。たとえば、USE_CXX11と、新しい名前空間を定義してinternalと定義し、この内部名前空間にマクロに依存する名前を導入します。たとえば、fooという名前のC++ライブラリ<foo>を使用する必要があります。これは<boost/foo/foo.hpp>でも利用できます。私は何をしてブースト/ C++用のC++ラッパー11

#ifdef USE_CXX11 
#include <foo> 
#else 
#include <boost/foo/foo.hpp> 
#endif 

namespace internal { 
#ifdef USE_CXX11 
using std::foo; 
#else 
using boost::foo::foo; 
#endif 
} 

そして、私は唯一のinternal::fooを使用し、ライブラリの残りの部分です。このライブラリを使用するサードパーティのコードでは、動作するC++ 11実装があるかどうかを示す適切なマクロを定義することができます。そして私の図書館は正しいヘッダーと名前空間をピックアップします。これまでのところ動作します。私は私の意図をうまく説明してくれることを望みます。

しかし、上記の解決策は私にとって非常に醜いようです。このようなことのためのより良い練習はありますか?あるいは、このアプローチがうまくいかない可能性がありますか?

+1

チェックアウトBoost.Algorithmsライブラリで(今後の1.50リリースの新機能)** Boost.TR1 ** –

+3

それはブースト中だし、あなたがサポートする必要がある場合時代遅れのコンパイラは、Boostのものをそのまま使ってください。 –

+0

ブーストを使用してみませんか? – fbafelipe

答えて

5

解決策は私にはうまく見えます。 BoostとC++ 11のインタフェースや実装が異なる場合には、唯一の問題が(Chetの言及のように)起こります。

実際に、私はやること

namespace boost { namespace algorithm { 
#if __cplusplus >= 201103L 
using std::find_if_not;  // Section 25.2.5 
#else 
template<typename InputIterator, typename Predicate> 
InputIterator find_if_not (InputIterator first, InputIterator last, Predicate p) 
{ 
    for (; first != last; ++first) 
     if (!p(*first)) 
      break; 
    return first; 
} 
#endif 
}} 
2

私はこれを実行可能な解決策として見ません。クラス間を条件付きで切り替えると、同じシグネチャとセマンティクスを持つメンバ関数のみに制限されます。また、多くの開発者にとって不自然に感じられる標準ライブラリへのアクセスをリダイレクトしています。

C++ 03とC++ 11の間でユーザビリティが懸念される場合、間違いなくすべてをBoostにする必要があります。 C++ 11が唯一のターゲットであれば、さまざまなコンパイラがどの言語とライブラリ機能をサポートしているかを評価することができます。十分にサポートされ、バグがないとみなされるものを選んでください。それ以外の場合は、必要に応じて後でBoostとリファクタを使用して、より多くのC++ 11ライブラリ機能をサポートします。ライブラリを切り替えるのではなく、タンデムでライブラリを使用するほうがはるかに良いでしょう。

ステータスページはGCC's C++ Standard Library implementationで開始できます。