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

问题描述

我有一个 trait 类,即将在可变参数 CRTP 中使用它来扩展 SmartPointer 类的功能

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

的后续内容创建的

一个示例特征类:

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

这是我的 SmartPointer 的实现,它由那些 trait 类的可变参数 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,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 { 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...