Как использовать autoconf с C++ 0x функции

Каковы лучшие практики для использования autoconf в сочетании с shared_ptr и другой C++ TR1/BOOST 0x обрабатывает по шаблону, чтобы максимизировать мобильность и пригодность для обслуживания?

С autoconf Я могу определить ли shared_ptr доступно как std::tr1::shared_ptr и/или boost::shared_ptr. Учитывая, что та же функция имеет два различных имени, у меня есть следующие вопросы:

  1. В коде, как должен shared_ptr быть сосланными?
  2. Если 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:: минимизировать зависимости от внешних библиотек (даже если библиотеками широко пользуются).

Действительно ли эти два решения являются общими? Есть ли лучшие?

5
задан Deduplicator 26 August 2019 в 12:17
поделиться

1 ответ

Одним из улучшений вашего примера кода и ответом на ваш первый вопрос является использование идиомы " 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 !

3
ответ дан 15 December 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: