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

如何在C ++中创建一个任意类型的指针常量?

如何解决如何在C ++中创建一个任意类型的指针常量?

我想要一个可以分配给任何指针的整数常量。我打算使用此特殊值来标记最近删除的指针(仅出于调试目的)。我想到了创建一个结构,然后使用处理所有可能的LHS指针和我的RHS自定义类型的模板来覆盖赋值运算符=的方法

但是,afaik除了作为成员外,无法重载赋值运算符=的左侧。我想出了这个(非编译)代码,如果没有语言限制,它将产生预期的结果。

struct TPointerConst
{
    TPointerConst(uint64 InValue) : Value(InValue) { }

    template <typename TPtr>
    friend TPtr& operator=(TPtr& Left,const TPointerConst& Right);
    
private:
    uint64 Value;
};

template <typename TPtr>
TPtr& operator=(TPtr& Left,const TPointerConst& Right) {
    return Left = (TPtr)Right.Value;
}

constexpr TPointerConst DELETED_PTR = 0xFADE404;

/* ... */

int* intPtr = DELETED_PTR;
float* fltPtr = DELETED_PTR;

我还考虑过将值强制转换为nullptr_t(考虑起来似乎很奇怪)只是为了满足编译器的要求,但由于我怀疑您不能将任何值强制转换为nullptr_t。

我想尽可能地避免使用宏,但是如果我为此功能留有一个像const一样的宏(比如旧的NULL),也不会太糟。我的目标至少是C ++ 11,因此与现代C ++一起使用的任何东西都将令人满意。

解决方法

template<typename T> operator T*()将非常有用:

struct TPointerConst{
    TPointerConst(std::uintptr_t v) :value(v){};

    template<typename T>
    operator T*() const{
        return reinterpret_cast<T*>(value);
    }
private:
    std::uintptr_t value;
};



int main(){
    TPointerConst a = 0xCDCDCDCD;
    int* b = a;
}
,

我设法通过重载转换运算符而不是赋值来解决此问题。老实说,我以为那不是模板,原来我错了。这是一个概念证明,我将在其中添加静态断言以使其更加安全。

struct TPointerConst
{
    constexpr TPointerConst(uint64 InValue) noexcept : Value(InValue) { }

    template <typename TPtr>
    constexpr operator TPtr() const { 
        return (TPtr)Value;
    }
    
private:
    uint64 Value;
};

constexpr TPointerConst DELETED_PTR(0x001);

int main()
{
  int* intPtr = DELETED_PTR;
  float* fltPtr = DELETED_PTR;
  
  cout << intPtr << endl << fltPtr;
}

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