我正在修改游戏的记忆,因此我做了类似的事情:
*(float*)0x89635637 = 10.0f;
现在我想把它变成一个模板函数,它允许我只用一次写地址来读取和设置内存,我想到这样的事情:
template <typename Variable> Variable GetSetAddress(Variable address, Variable value = NULL)
{
if (value != NULL)
*(Variable*)address = value;
return *(Variable*)address;
}
现在我尝试这样称呼它:
float value = GetSetAddress<float>(0x89635637, 10.0f);
但它给了我这个错误:
错误C2440:&#39;输入&#39; :无法转换为&#39; float&#39;到&#39;浮动*&#39;
我对使用模板缺乏经验,所以如果有人能指出我正确的方向,我会感激不尽。提前谢谢!
答案 0 :(得分:1)
将value
与NULL
进行比较是没有意义的,因为value
在这种情况下是float
。另外,address
参数不应该是Variable
,它应该是一个可以存储指针值的整数类型,如std::uintptr_t
template <typename T> T GetSetAddress(std::uintptr_t address, T value)
{
*(T*)address = value;
return *(T*)address;
}
通常最好避免使用c风格的演员表。您可以使用reinterpret_cast
代替,并简化return语句:
template <typename T> T GetSetAddress(std::uintptr_t address, T value)
{
*reinterpret_cast<T*>(address) = value;
return value;
}