スレッド ライブラリの一部を 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 の他の部分がコードで使用される可能性があるためです。これを達成するための最良の方法は何ですか?
ありがとう!