带有附加模板参数的可变参数CRTP基类 [英] Variadic CRTP Base Class with Additional Template Parameters

查看:73
本文介绍了带有附加模板参数的可变参数CRTP基类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

此问题是作为 https://stackoverflow.com/a/65373058/5677080 的后续内容创建的

特质类示例:

  template<派生的类型名,类型名DELETER>所属类{上市:使用deleter_type = DELETER;/* ... */}; 

这里是我的SmartPointer的实现,可变特征CRTP通过这些特质类扩展了它:

  template< typename T,template< typename>类POINTER_TRAITS>类SmartPointer;template< typename T,模板< typename>类POINTER_TRAITS>struct element_type< SmartPointer< T,POINTER_TRAITS>{使用类型= T;};template< template< typename,typename ...>课... TRAITS>结构make_traits{template< typename DERIVED>struct特性:public TRAITS< DERIVED> ... {};};template< typename T,模板< typename>类POINTER_TRAITS>类SmartPointer:公共POINTER_TRAITS< SmartPointer< T,POINTER_TRAITS>{上市:使用指针= T *;使用element_type = T;/* ... */}; 

最后是类型别名,用于定义特定的智能指针类型(此处为 unique_ptr )

  template< typename T,typename DELETER = DefaultDeleter< T>>使用unique_ptr = SmartPointer< T,make_traits< MoveablePointer,Owning> :: template Traits> ;; 

问题是如何将 DELETER 模板参数移交给 unique_ptr 类型别名中的Owning类...

我猜是这样的(不起作用的代码,只是为了演示意图):

  template< typename T,typename DELETER = DefaultDeleter< T>>使用unique_ptr = SmartPointer< T,make_traits< MoveablePointer,拥有< DELETER>> :: template Traits> ;;^^^^^^^^^^^^^^^^ 

解决方案

遵循这些原则,也许是这样:

 模板< typename DELETER>struct MakeOwningWithDeleter {模板< typename T>使用类型= Owning< T,DELETER>}; 

现在,您可以将 MakeOwningWithDeleter< DELETER> :: type 传递给 make_traits .您已经在 make_traits 中使用了相同的技巧.

I have a trait classes which are about to be used in variadic CRTP to extend the features of SmartPointer class.

This question is created as the followup of https://stackoverflow.com/a/65373058/5677080

An example trait class:

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

Here comes the implemnetation of my SmartPointer which is being extended by variadic CRTP by those trait classes:

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;

    /* ... */
};

Finally there comes the type alias to define particular smart pointer type (here unique_ptr)

template<typename T, typename DELETER = DefaultDeleter<T>>
using unique_ptr = SmartPointer<T, make_traits<MoveablePointer, Owning>::template Traits>;

The problem is how to hand over the DELETER template parameter to the Owning class in unique_ptr type alias...

I guess something like (non-working code, just to demonstrate the intension):

template<typename T, typename DELETER = DefaultDeleter<T>>
using unique_ptr = SmartPointer<T, make_traits<MoveablePointer, Owning<DELETER>>::template Traits>;
                                                                ^^^^^^^^^^^^^^^

解决方案

Something along these lines, perhaps:

template <typename DELETER>
struct MakeOwningWithDeleter {
  template <typename T>
  using type = Owning<T, DELETER>
};

Now you can pass MakeOwningWithDeleter<DELETER>::type to make_traits. Same trick you already use for make_traits.

这篇关于带有附加模板参数的可变参数CRTP基类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆