【发布时间】:2020-12-06 19:01:23
【问题描述】:
我即将实现标记指针,它使用未使用的地址位来保存有效负载。我正在寻找访问有效负载的有效方法。声明如下:
template<typename T, template<class> class PAYLOAD, DeleterType DELETER = DefaultDeleter<T>, size_t ALIGNMENT = alignof( T )>
class tagged_ptr;
它与unique_ptr 共享基本原理,例如删除器等。我面临的问题是使用PAYLOAD 模板模板参数来定义访问器类来操作有效负载位。 PAYLOAD 应该是一个类模板,只包含访问器函数(getter/setter),没有数据。这个想法是使用PAYLOAD 作为tagged_ptr 的CRTP 基类来授予对其私有数据的访问权——指针本身(uintptr_t——tagged_ptr 持有的地址)。所以我尝试将其定义为:
template<typename T, template<class> class PAYLOAD, DeleterType DELETER = DefaultDeleter<T>, size_t ALIGNMENT = alignof( T )>
class tagged_ptr : public PAYLOAD<tagged_ptr> { ... }
但它不编译报告:
error: type/value mismatch at argument 1 in template parameter list for 'template<class> class PAYLOAD'
[build] 15 | class tagged_ptr : public PAYLOAD<tagged_ptr> {
[build] | ^
所以我的问题是-
如何为派生类模板实现CRTP?
在正常的 CRTP 中,模式是这样的
template<typename DERIVED>
class Base { /* use static casts to DERIVED to access its data */ }
class Derived : public Base<Derived> { ... }
表示Derived 不是类模板,但就我而言,它是......那么如何解决呢?非常感谢您的帮助!
【问题讨论】: