Каковы лучшие практики для использования autoconf
в сочетании с shared_ptr
и другой C++ TR1/BOOST 0x обрабатывает по шаблону, чтобы максимизировать мобильность и пригодность для обслуживания?
С autoconf
Я могу определить ли shared_ptr
доступно как std::tr1::shared_ptr
и/или boost::shared_ptr
. Учитывая, что та же функция имеет два различных имени, у меня есть следующие вопросы:
shared_ptr
быть сосланными? std::tr1::shared_ptr
будьте предпочтены boost::shared_ptr
?Для первого код в настоящее время использует условные выражения препроцессора, позволяющие неполные ссылки shared_ptr
, а-ля
#if HAVE_STD_TR1_SHARED_PTR
using std::tr1::shared_ptr;
#elif HAVE_BOOST_SHARED_PTR
using boost::shared_ptr;
#else
#error "No definition for shared_ptr found"
#endif
Во-вторых, использование кода std::tr1::
boost::
минимизировать зависимости от внешних библиотек (даже если библиотеками широко пользуются).
Действительно ли эти два решения являются общими? Есть ли лучшие?
Одним из улучшений вашего примера кода и ответом на ваш первый вопрос является использование идиомы " template typedef ":
#if HAVE_STD_TR1_SHARED_PTR
template <class T>
struct SharedPtr {
typedef std::tr1::shared_ptr<T> Type;
};
#elif HAVE_BOOST_SHARED_PTR
template <class T>
struct SharedPtr {
typedef boost::shared_ptr<T> Type;
};
#else
# error "No definition for shared_ptr found"
#endif
// Declare a shared_ptr using our wrapper classes, saving us from having to care
// where shared_ptr comes from:
SharedPtr<int>::Type my_shared_int(new int(42));
Основная проблема с этим необходимость использования нотации :: Type. Это просто потому, что C ++ в настоящее время не имеет возможности иметь typedef для шаблона. У вас может быть typedef для типа шаблона instance , но здесь важно сохранить универсальность.
Что касается того, следует ли вам предпочесть TR1 вместо Boost, я бы сказал, что да. Теперь, когда компиляторы поставляются с частичной поддержкой C ++ 0x, я бы сказал, что вам также следует протестировать std :: shared_ptr и предпочесть это любому из других.
Вам может понадобиться четвертый typedef, если есть компиляторы, у которых shared_ptr находится где-то еще. Я не знаю такого компилятора, но некоторый код C ++, который я поддерживаю, делает нечто похожее на то, о чем вы спрашиваете, с общим расширением slist
стандартной библиотеки C ++ для односвязных списков. Старые версии g ++ помещают его в глобальное пространство имен, современные g ++ помещают его в специфичное для компилятора пространство имен __ gnu_cxx
, и мы даже нашли тот, который по ошибке поместил его в std
!