Чтобы определить, в каком пространстве имен находится shared_ptr, вам нужно что-то вроде autoconf - вот почему был создан autoconf (обнаружение вариаций платформы / компилятора).Вы можете сделать это с помощью:
AC_LANG(C++)
AC_MSG_CHECKING([for std::shared_ptr])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[#include <memory>]]
[[std::shared_ptr<int> have_shared_ptr;]])
], [
AC_MSG_RESULT([yes])
AC_DEFINE_UNQUOTED([HAVE_STD_SHARED_PTR], 1, [Define to 1 if you have the `std::shared_ptr' class.])
], [
AC_MSG_RESULT([no])
AC_DEFINE_UNQUOTED([HAVE_STD_SHARED_PTR], 0, [Define to 1 if you have the `std::shared_ptr' class.])
])
Повторите для std::tr1::shared_ptr
, boost::tr1::shared_ptr
и boost::shared_ptr
.
Затем вы можете создать файл shared_ptr.hpp
, который будет выглядеть примерно так:
#include <config.h>
#if defined(HAVE_STD_SHARED_PTR)
namespace ptr = std;
#elif defined(HAVE_STD_TR1_SHARED_PTR)
namespace ptr = std::tr1;
#elif defined(HAVE_BOOST_SHARED_PTR)
namespace ptr = boost;
#elif defined(HAVE_BOOST_TR1_SHARED_PTR)
namespace ptr = boost::tr1;
#else
# error No shared_ptr found.
#endif
... который затем можно использовать как:
ptr::shared_ptr<int> pointer(new int(5));