8

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

#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の実装が機能しているか、ブーストのみを使用できるかを示すことができます。そして、私のライブラリは正しいヘッダーと名前空間を取得します。これは今のところ機能します。私の意図をうまく説明できたと思います。

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

4

2 に答える 2

5

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

実際、私はBoost.Algorithmsライブラリでそれを行っています(次の1.50リリースの新機能)

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
}}
于 2012-06-05T04:39:58.293 に答える
2

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

使いやすさがC++03とC++11の間で懸念される場合は、すべてにBoostを使用する必要があります。C ++ 11が唯一のターゲットである場合は、さまざまなコンパイラーを評価して、それらがサポートする言語とライブラリーの機能を確認する方がうまくいく可能性があります。十分にサポートされ、バグがないと見なされるものを選択してください。それ以外の場合は、Boostを使用し、必要に応じて後でリファクタリングして、より多くのC++11ライブラリ機能をサポートします。ライブラリを切り替えるよりも、ライブラリを組み合わせて使用​​する方がはるかに優れています。

GCCのC++標準ライブラリ実装のステータスページから始めることができます。

于 2012-06-05T02:26:34.627 に答える