Я перемещаю часть библиотеки потоков из C++ 03 в C++ 11, но я бы хотел, чтобы она была совместима с Boost, в качестве опции для пользователей у которых нет компиляторов C++ 11. Так как C++ 11 STL и увеличить 1,54 в основном имеют один и тот же интерфейс (по крайней мере для части меня интересует), неплохо было бы иметь что-то вроде этого:Абстрактные связанные с потоком типы и методы STL и Boost
#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(...);
Э.Г. Мне не нравится писать: типа все время.
Кроме того, я хотел бы переопределить make_shared функцию, т.е. отображение его следующим образом:
MyLibrary::MakeShared<T> --> NAMESPACE::make_shared<T>
, где NAMESPACE либо «станд» или «импульс». Я думаю, что-то вроде
#define USING(WHAT) using NAMESPACE::WHAT
USING(make_shared);
не является жизнеспособным вариантом ... правильно?
Переопределение полного пространства имен boost не является решением, так как другие части Boost могут использоваться в коде. Какой был бы лучший способ достичь этого?
Спасибо!
Помните, что библиотеки потоков в boost и C++ 11 имеют важные отличия в поведении: см. Http://stackoverflow.com/a/7242294/231299 – beerboy