Я работаю над кроссплатформенным кодом, который требует общих указателей. По независящим от меня причинам мы пока не можем использовать 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
, Тем не менее, я не могу принять решение о плюсах и минусах каждого из подходов для принятия решения.
Четыре варианта совместимы с 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. все время).
Мы делаем что-то подобное в нашем проекте:
#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
Пространство имен, как это), но он работал без проблем в течение многих лет.