具有附加模板参数的可变 CRTP 基础 Class
Variadic CRTP Base Class with Additional Template Parameters
我有一个特征 classes,即将在可变 CRTP 中使用它来扩展 SmartPointer 的功能 class。
此问题是
的后续问题
示例特征 class:
template<typename DERIVED, typename DELETER>
class Owning {
public:
using deleter_type = DELETER;
/* ... */
};
这是我的 SmartPointer 的实现,它正在通过可变 CRTP 的那些特征进行扩展 classes:
template<typename T, template<typename> class POINTER_TRAITS>
class SmartPointer;
template<typename T, template<typename> class POINTER_TRAITS>
struct element_type<SmartPointer<T, POINTER_TRAITS>>
{
using type = T;
};
template<template<typename, typename...> class... TRAITS>
struct make_traits
{
template<typename DERIVED>
struct Traits : public TRAITS<DERIVED>... {};
};
template<typename T, template<typename> class POINTER_TRAITS>
class SmartPointer : public POINTER_TRAITS<SmartPointer<T, POINTER_TRAITS>> {
public:
using pointer = T*;
using element_type = T;
/* ... */
};
最后是类型别名来定义特定的智能指针类型(这里unique_ptr
)
template<typename T, typename DELETER = DefaultDeleter<T>>
using unique_ptr = SmartPointer<T, make_traits<MoveablePointer, Owning>::template Traits>;
问题是如何将DELETER
模板参数交给Owning class in unique_ptr
类型别名...
我猜是这样的(非工作代码,只是为了证明意图):
template<typename T, typename DELETER = DefaultDeleter<T>>
using unique_ptr = SmartPointer<T, make_traits<MoveablePointer, Owning<DELETER>>::template Traits>;
^^^^^^^^^^^^^^^
大概是这样的:
template <typename DELETER>
struct MakeOwningWithDeleter {
template <typename T>
using type = Owning<T, DELETER>
};
现在您可以将 MakeOwningWithDeleter<DELETER>::type
传递给 make_traits
。您已经在 make_traits
.
中使用了相同的技巧
template<template<class...>class Z, class...Ts>
struct Partial{
template<class...Us>
using Apply=Z<Ts...,Us...>;
};
然后
template<typename T, typename DELETER = DefaultDeleter<T>>
using unique_ptr = SmartPointer<T, make_traits<MoveablePointer, Partial<Owning,DELETER>::template Apply>::template Traits>;
这确实需要进行以下更改:
template<typename DELETER, typename DERIVED>
class Owning {
我有一个特征 classes,即将在可变 CRTP 中使用它来扩展 SmartPointer 的功能 class。
此问题是
示例特征 class:
template<typename DERIVED, typename DELETER>
class Owning {
public:
using deleter_type = DELETER;
/* ... */
};
这是我的 SmartPointer 的实现,它正在通过可变 CRTP 的那些特征进行扩展 classes:
template<typename T, template<typename> class POINTER_TRAITS>
class SmartPointer;
template<typename T, template<typename> class POINTER_TRAITS>
struct element_type<SmartPointer<T, POINTER_TRAITS>>
{
using type = T;
};
template<template<typename, typename...> class... TRAITS>
struct make_traits
{
template<typename DERIVED>
struct Traits : public TRAITS<DERIVED>... {};
};
template<typename T, template<typename> class POINTER_TRAITS>
class SmartPointer : public POINTER_TRAITS<SmartPointer<T, POINTER_TRAITS>> {
public:
using pointer = T*;
using element_type = T;
/* ... */
};
最后是类型别名来定义特定的智能指针类型(这里unique_ptr
)
template<typename T, typename DELETER = DefaultDeleter<T>>
using unique_ptr = SmartPointer<T, make_traits<MoveablePointer, Owning>::template Traits>;
问题是如何将DELETER
模板参数交给Owning class in unique_ptr
类型别名...
我猜是这样的(非工作代码,只是为了证明意图):
template<typename T, typename DELETER = DefaultDeleter<T>>
using unique_ptr = SmartPointer<T, make_traits<MoveablePointer, Owning<DELETER>>::template Traits>;
^^^^^^^^^^^^^^^
大概是这样的:
template <typename DELETER>
struct MakeOwningWithDeleter {
template <typename T>
using type = Owning<T, DELETER>
};
现在您可以将 MakeOwningWithDeleter<DELETER>::type
传递给 make_traits
。您已经在 make_traits
.
template<template<class...>class Z, class...Ts>
struct Partial{
template<class...Us>
using Apply=Z<Ts...,Us...>;
};
然后
template<typename T, typename DELETER = DefaultDeleter<T>>
using unique_ptr = SmartPointer<T, make_traits<MoveablePointer, Partial<Owning,DELETER>::template Apply>::template Traits>;
这确实需要进行以下更改:
template<typename DELETER, typename DERIVED>
class Owning {