2013-03-06 200 views
1

我想添加一個參數到一個函數,我需要新的參數是一個結構類型。如何將結構類型作爲參數傳遞給函數?

這裏是我想改變的功能,從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' does not refer to a value

回答

4

看來,你不需要你的結構類型的對象傳遞到函數(你只需要通過類型本身),所以正確的函數聲明將

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)); 

在這裏,你不要一定需要明確指定類型,因爲編譯器可以從所傳遞的對象推斷出結論。

+0

這正是我正在尋找的,謝謝! – 0xced 2013-03-06 09:43:49

2

你需要傳遞一個類型,而不是類型本身的實際對象作爲參數:

method_t m; 

prepare_patch_objc_methods(m, class_data->baseMethods, /* ... */); 

編輯:如果不明確:您不能將類型(例如method_t)作爲普通參數傳遞 - 您只能將其作爲模板參數傳遞之三。在一個功能模板的情況下,模板參數典型地自動從您傳遞該參數的類型,編譯器推斷,所以下式給出:

template <class T> 
void f(T x) {} 

編譯器將弄清楚,如果傳遞(例如) 1作爲參數,那麼T將爲int用於此實例化。如果你通過1.0代替,它會發現Tdouble該intantiization。

如果你確實想要(比如想將值轉換爲T的類型,而不是T被選作任何類型傳遞的對象),你可以爲函數模板指定一個模板參數,就像你可以/爲一個類模板。例如,即使您傳遞的值是一個int,f<double>(1)也會實例化f作爲double。因此,在傳遞給函數之前,int將被提升爲double。

+2

我相信他問的是如何傳遞類型符號本身,而不是該類型的單個對象。 – 2013-03-06 06:15:10

相關問題