具有附加模板参数的变分CRTP基类



我有一个特性类,即将在可变CRTP中使用,以扩展SmartPointer类的功能。

这个问题是作为https://stackoverflow.com/a/65373058/5677080

特征类示例:

template<typename DERIVED, typename DELETER>
class Owning { 
public:
using deleter_type = DELETER;

/* ... */
};

下面是我的SmartPointer的实现,它由可变CRTP通过以下特征类扩展:

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模板参数移交给unique_ptr类型别名中的Owning类。。。

我猜类似于(非工作代码,只是为了展示其内涵(:

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 { 

最新更新