如何解决带有附加模板参数的可变 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 举报,一经查实,本站将立刻删除。