【问题标题】:Tagged pointer CRTP accessor class标记指针 CRTP 访问器类
【发布时间】: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_ptrCRTP 基类来授予对其私有数据的访问权——指针本身(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 不是类模板,但就我而言,它是......那么如何解决呢?非常感谢您的帮助!

【问题讨论】:

    标签: c++ templates c++20 crtp


    【解决方案1】:
    template<typename T, template<class> class PAYLOAD>
    class tagged_ptr : public PAYLOAD<tagged_ptr<T,PAYLOAD>> {};
    

    Live example.

    【讨论】:

    • 啊,所以,我需要明确提及所有模板参数...非常感谢!现在它可以编译了 :) 标记为已解决...
    • @MartinKopecký:换句话说,注入的类名(为您提供模板参数列表)仅在打开 { 之后可用。
    猜你喜欢
    • 2013-06-10
    • 1970-01-01
    • 2021-12-25
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多