微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决带有附加模板参数的可变 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 { 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?