繁体   English   中英

带有附加模板参数的可变 CRTP 基础 Class

[英]Variadic CRTP Base Class with Additional Template Parameters

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

这个问题是作为https://stackoverflow.com/a/65373058/5677080的后续问题创建的

一个示例性状 class:

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 class...

我猜是这样的(非工作代码,只是为了展示意图):

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 { 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM