模板用于操作内存的函数

时间:2017-12-07 12:28:38

标签: c++ templates memory

我正在修改游戏的记忆,因此我做了类似的事情:

*(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;

我对使用模板缺乏经验,所以如果有人能指出我正确的方向,我会感激不尽。提前谢谢!

1 个答案:

答案 0 :(得分:1)

valueNULL进行比较是没有意义的,因为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;
}