1

スレッド ライブラリの一部を C++03 から C++11 に移動していますが、C++11 コンパイラを持っていないユーザー向けのオプションとして、Boost との互換性を維持したいと考えています。C++11 STL と Boost 1.54 は基本的に同じインターフェースを持っているので (少なくとも私が興味を持っている部分では)、次のようなものがあるといいでしょう:

#ifdef USING_BOOST
#define NAMESPACE boost
#else
#define NAMESPACE std
#endif

typedef NAMESPACE::mutex MyLibrary::Mutex;
typedef NAMESPACE::condition_variable MyLibrary::ConditionVariable;
...

この問題は、unique_lock などのテンプレートで発生します。より良いアプローチは次のようになります。

#define TYPEDEF(WHAT, AS) typedef LIBPREFIX::WHAT AS

#define TYPEDEF_T(WHAT, AS)                 \
    template <typename T>                   \
    struct AS                               \
    {                                       \
        typedef LIBPREFIX::WHAT<T> type;    \
    };

TYPEDEF( thread, Thread );
TYPEDEF( mutex, Mutex );
TYPEDEF( condition_variable, ConditionVariable );

TYPEDEF_T( lock_guard, LockGuard );
TYPEDEF_T( unique_lock, UniqueLock );
TYPEDEF_T( shared_ptr, SharedPtr );

ただし、次のように使用する必要があります。

LockGuard<Mutex>::type lock(...);

たとえば、::type を常に記述しなければならないのは好きではありません。

また、make_shared 関数をオーバーライドしたいと思います。つまり、次のようにマッピングします。

MyLibrary::MakeShared<T> --> NAMESPACE::make_shared<T>

ここで、NAMESPACE は「std」または「boost」のいずれかです。私はそれのようなものだと思います

#define USING(WHAT) using NAMESPACE::WHAT
USING( make_shared );

実行可能なオプションではありません...そうですか?

Boost 名前空間全体をオーバーライドすることは解決策ではありません。Boost の他の部分がコードで使用される可能性があるためです。これを達成するための最良の方法は何ですか?

ありがとう!

4

3 に答える 3

0

最も簡単なオプションは、ブーストを使用し続けることではないでしょうか? そうすることで、自分のために不必要な作業を行うことを避けることができます。それができない場合は、どちらかのライブラリから選択したい型の typedef だけではどうですか:

namespace foo {
#ifdef USING_BOOST
    typedef boost::mutex       mutex;
    typedef boost::scoped_lock mutex_lock;
#else
    typedef std::mutex       mutex;
    typedef std::unique_lock mutex_lock;
#endif
}

foo::mutex myMutex;
于 2013-09-09T10:18:07.593 に答える