2012-05-21 47 views
6

我需要一個函數指針作爲自變量的函數:C++用作其他函數的參數綁定功能

int func(int a, int (*b)(int, int)) 
{ 
    return b(a,1); 
} 

現在我想使用已在此函數三個參數一定的功能:

int c(int, int, int) 
{ 
    // ... 
} 

我如何綁定的c第一個參數,使我能夠做到:

int i = func(10, c_bound); 

我一直在尋找std::bind1st,但我似乎無法弄清楚。它不會返回一個函數指針嗎?我有充分的自由來適應func,所以任何方法的改變都是可能的。 Althoug我希望我的代碼的用戶能夠定義他們自己的c ...

請注意,上述是我正在使用的實際功能的一個兇猛的簡化。

該項目可悲地要求C++98

回答

12

你不能那樣做。您將不得不修改func以首先獲取函數對象。喜歡的東西:

int func(int a, std::function< int(int, int) > b) 
{ 
    return b(a, rand()); 
} 

其實,沒有必要爲b是一個std::function,它可以代替模板:

template< typename T > 
int func(int a, T b) 
{ 
    return b(a, rand()); 
} 

,但我會和std::function版本清晰度稍差堅持錯誤的編譯器輸出錯綜複雜。

那麼你就可以這樣做:

int i = func(10, std::bind(&c, _1, _2, some-value)); 

注意,這一切都是C++ 11,但你可以使用Boost做在C++ 03

+2

即使我需要C++ 98代碼,這個答案很容易轉換成相當於boost的提升。 – romeovs

1

好吧,如果你知道在編譯的時候,你必須綁定c。與什麼,你可以定義一個新的功能

int c_bound(int a, int b) { 
    return c(a,b,some_value); 
} 

這顯然不是一個通用的解決方案,但可能解決當前的問題。否則,K-ballo的解決方案似乎是唯一的通用解決方案。但是,這要求您能夠更改func的簽名。如果你真的有一個API,你不能觸摸簽名,你仍然需要綁定一個參數,如果上述解決方案沒有解決你的具體情況:(小心,前面的矯枉過正)我一直想用基於LLVM的解決方案在運行時編譯一個函數,並在這種情況下傳遞它的地址。

0

您將無法使用3參數函數作爲2參數函數;主要是因爲沒有真正的方法來確定第三個參數會做什麼。

雖然上面的回答會的工作,這裏是另一種選擇:

如果內func參數爲c(),在使用中的一個,是恆定的,你可以寫一個包裝功能c(int, int, int)

int d(int a, int b) 
{ 
    return c(a, b, 0); //use a constant parameter 
} 

或者,如果你能確定從兩個給定參數的第三個參數,你也可以嘗試:

int e(int a, int b) 
{ 
    int extra = 0; 
    ///Determine extra from a, and b 
    return c(a, b, c); 
} 
相關問題