【发布时间】:2021-01-22 10:20:33
【问题描述】:
我想要一个可以分配给任何指针的整数常量。我打算使用这个特殊值来标记最近删除的指针(仅用于调试目的)。我想创建一个结构,然后用一个处理所有可能的 LHS 指针和我的 RHS 自定义类型的模板覆盖赋值 operator=。
但是,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++ 相匹配的东西都会令人满意。
【问题讨论】:
-
总是使用
std::unique_ptr(或共享)然后整个问题消失(以及std::vector用于本地缓冲区)怎么样? -
@RichardCritten 我打算将此功能用作我自己的共享指针和自定义分配器的调试工具。我实际上是在尝试从我的引擎中的游戏程序员那里抽象出你在谈论的东西,所以它几乎是关于实现这两者。
-
你描述的很像
nullptr -
你想发明
void *吗?
标签: c++ pointers templates constants