gpt4 book ai didi

c++ - 如何将结构类型作为参数传递给函数?

转载 作者:行者123 更新时间:2023-11-30 00:53:56 27 4
gpt4 key购买 nike

我正在尝试向函数添加一个参数,我需要新参数是一个结构类型。

这是我要更改的功能,来自 dyld_decache.cpp

void prepare_patch_objc_methods(uint32_t method_vmaddr, uint32_t override_vmaddr);

我改成这样:

template <typename T>
void prepare_patch_objc_methods(typename T::type, uint32_t list_vmaddr, uint32_t override_vmaddr);

prepare_patch_objc_methods 的实现中,我将所有出现的 method_t 更改为 T 并且编译正常。

method_t 结构定义如下:

struct method_t {
uint32_t name;
uint32_t types;
uint32_t imp;
};

现在,如何在调用此函数时传递结构类型?

我试过了

this->prepare_patch_objc_methods(method_t, class_data->baseMethods, class_obj->data + offsetof(class_ro_t, baseMethods));

但我收到以下错误:'method_t' 没有引用值

最佳答案

似乎你不需要将你的结构类型的对象传递给函数(你只需要传递一个类型本身),所以正确的函数声明是

template <typename T>
void prepare_patch_objc_methods(uint32_t list_vmaddr, uint32_t override_vmaddr);

现在将结构类型传递给函数,您可以这样调用它

this->prepare_patch_objc_methods<method_t>(class_data->baseMethods, class_obj->data + offsetof(class_ro_t, baseMethods));

如果你真的需要传递一个参数类型的对象,你可以这样做

template <typename T>
void prepare_patch_objc_methods(const T &object, uint32_t list_vmaddr, uint32_t override_vmaddr);

然后你这样调用它

method_t obj;
this->prepare_patch_objc_methods<method_t>(obj, class_data->baseMethods, class_obj->data + offsetof(class_ro_t, baseMethods));

或者像这样

this->prepare_patch_objc_methods(obj, class_data->baseMethods, class_obj->data + offsetof(class_ro_t, baseMethods));

在这里您不必明确指定类型,因为编译器可以从您传递的对象中推断出它。

关于c++ - 如何将结构类型作为参数传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15240107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com