2010-02-17 74 views
1

我可以假設,從調用堆棧點來看,它調用像功能1結構與功能參數

int function1(T1 t1, T2 t2); 

的功能,而不是另一個類似功能2一樣的嗎?

struct parameters_t 
{ 
    Wide<T1>::type t1; 
    Wide<T2>::type t2; 
} 

int function2(parameters_t p); 

模板寬Ť到所述處理器的字長。 例如,對於32位處理器:

template<typename T, bool b = sizeof(T) >=4 > 
struct Wide 
{ 
    typedef T type; 
}; 

template<typename T> 
struct Wide<T,false> 
{ 
    typedef unsigned int type; 
}; 

我需要做這樣的事情:

typedef int (*function_t)(parameters_t); 

function_t function = (function_t) &function1; 

parameters_t params; 
// initialize params 
function(params); 

謝謝!

回答

2

問題1.兩個函數調用不一定是相同的 - 調用約定從右向左和從左向右推送參數都廣泛使用。

這聽起來像你想創建一個函數,它需要一個可變數量的變量類型的參數。要做到這一點,我想它會採用類似std::vector<boost:any>的參數。

+0

你當然是正確的,並且正在說我是同一件事,但如果你打算使用這個方法並將該向量放入一個args類或結構體中,然後再進一步模板化,我會更進一步稍後您可以添加更多不同類型的參數,而無需對API進行任何更改。 – 2010-02-17 00:52:05

+0

@San Jacint:哦,是的,這個主題肯定有不少變化。底線是弄清楚你真正需要什麼,然後做(直接)。如果你對編譯器說謊,它會得到它的報復,並且試圖將單個參數傳遞給定義了一個結構的東西(反之亦然)直接落入該類別中。 – 2010-02-17 03:09:48

+0

好的。它的工作原理是因爲我使用了gcc,它將參數從右到左推進,但確實在不同平臺之間的註冊使用情況存在差異。 我不希望編譯器稍後對我進行報復:) 謝謝你們兩位! – 2010-02-17 10:13:13

1

你所問的實際上是兩個不同的問題。我不認爲這兩種方法在調用堆棧上看起來是一樣的,但爲了您需要將參數傳遞給指針所調用的函數,它可以工作。

你應該考慮通過引用或指針傳遞它。一遍又一遍地傳遞大型結構將效率低下。