Jarod ,
handle(handle<_type> const & other) :
mData(make_pptr(*(other.mData)))
{}
make_pptr shared_ptr<_type>&, make_pptr , , shared_ptr<_type> const&. const&, , make_pptr, const lvalue.
constexpr auto make_pptr(ptr & pointer)
{
return std::make_shared<ptr>(pointer);
}
- , , shared_ptr<_type>.
, shared_ptr<T>
namespace detail
{
template<typename... _args>
using zeroth_type = typename std::tuple_element<0, std::tuple<_args...>>::type;
template<typename T, bool eval_args, typename... _args>
struct is_shared_ptr
: std::false_type
{};
template<typename T, typename... _args>
struct is_shared_ptr<T, true, _args...>
: std::is_same<std::decay_t<zeroth_type<_args...>>,
std::shared_ptr<T>
>
{};
}
make_pptr
template<typename ..._args,
typename = std::enable_if_t<
not detail::is_shared_ptr<_type, sizeof...(_args), _args...>::value
>
>
constexpr auto make_pptr(_args && ...args)
{
return std::make_shared<ptr>(make_ptr(std::forward<_args>(args)...));
}
make_ptr, , , , _type nullptr.
constexpr auto make_ptr()
{
return std::make_shared<_type>();
}