Использование boost :: shared_ptr с целью его последующей замены

Я работаю над кроссплатформенным кодом, который требует общих указателей. По независящим от меня причинам мы пока не можем использовать C ++ 11. Итак, я предложил использовать boost :: shared_ptr. Когда мы примем C ++ 11 (возможно, через год), мы сможем заменить интеллектуальные указатели надстройки на интеллектуальные указатели std. Мой вопрос о том, как лучше использовать повышение, чтобы потом было легче переключаться. Псевдоним шаблона недоступен, поэтому отсутствует следующее:

namespace my {
template <typename T>
using shared_ptr = boost::shared_ptr<T>;
}

Другой метод обертывания shared_ptr внутри другой структуры приводит к появлению уродливых и нечитаемых API, так как тогда мне придется использовать его таким образом my::shared_ptr<int>::type:

 namespace my  {
template<typename T>
struct shared_ptr
{
typedef boost::shared_ptr<T> type;
};
}

Я ищу альтернативы этому. Любые предложения будут оценены.

РЕДАКТИРОВАТЬ:
Другой вариант, который я рассмотрел, был такой:

namespace my {
using boost::shared_ptr;
}

А потом использовать my::shared_ptr<int>, Позже я бы поменял boost в std в namespace my, Тем не менее, я не могу принять решение о плюсах и минусах каждого из подходов для принятия решения.

6

Решение

Четыре варианта совместимы с C ++ 98,

1) использовать impl::shared_pointer<T>, И переключиться с:

namespace impl = boost; в namespace impl = std;

2) (более элегантно, но более рискованно) использовать shared_ptr без квалификации пространства имен и последующего переключения с

using boost::shared_ptr в using std::shared_ptr,

3) (некрасиво, но я Угадай является предпочтительным промышленным решением) Используйте макросы полностью.

#if DETECTC++11
#define SHARED_PTR std::shared_ptr
#else
#define SHARED_PTR boost::shared_ptr
#endif

4) Объедините 3 выше.

Анонимные пространства имен могут помочь сохранить using операторы, локальные по отношению к файлу, поэтому вы можете управлять каждым файлом-источником, например:

namespace{
using std::shared_ptr;
}

(Я лично пользуюсь 2. все время).

5

Другие решения

Мы делаем что-то подобное в нашем проекте:

#if compiler_doesnt_support_c++11
#include <boost/shared_ptr.hpp>

namespace std {
using boost::shared_ptr;
}
#elif compiler_has_c++11_in_tr1
#include <memory>
namespace std {
using std::tr1::shared_ptr;
}
#else
#include <memory>
#endif

И просто использовать std::shared_ptr в коде.

Да, это технически неопределенное поведение (так как вы не можете добавлять имена в ::std Пространство имен, как это), но он работал без проблем в течение многих лет.

1

По вопросам рекламы [email protected]