2015-11-06 92 views
0

我試圖編寫一個函數(我們稱之爲函數A),它可以接收用戶定義的函數作爲輸入(例如,用戶定義的函數任意數量的變量並返回一個整數 - 我們將稱這個函數爲B)。我想傳遞函數B作爲函數A的參數,只修改函數B中的一些變量,並根據需要從函數A中多次調用函數B.C++將用戶定義的函數傳遞給另一個函數

我在想我可以得到這個通過創建函數B指針的變量並在每次調用時修改指針來工作,但是我不知道如何創建它,所以如果要傳遞給函數B的變量的數量未知,我可以從函數A中調用函數B 。

有沒有人有任何建議,我可以如何將用戶指定的函數作爲參數傳遞給另一個函數?

+0

簡答:您不能。當你調用B時,你必須傳遞*一些*參數。改變這一點需要改變源代碼,這意味着重新編譯。如果您確實需要可變數量的參數,則可能需要編寫B來接受類似於參數向量的東西。如果類型可以改變,那可能需要像'std :: vector '一樣。 –

回答

1

你想要的是一個函數指針。

例如,通過接受一個int並返回雙重的功能。

#include <iostream> 
double B(int x) // sample function that we call 
{ 
     return x*42.0; 
} 

void A(double (*f)(int)) 
{ 
    for (int i = 0; i < 25; ++i) 
     std::cout << f(i) << '\n'; 
} 

int main() 
{ 
    A(B); 
} 

如果您想傳遞接受可變參數列表的函數,請修改上述內容。在標準標題<cstdarg>上尋找有關如何做到這一點的指針。

也有涉及模板(具體地,模板函子)和lambda表達式技術(在C++ 11和更高版本)。但是使用指向函數的指針就足以讓你開始。

0

由於你提到你可以修改在函數B的變量,函數指針是不是一個好的選擇,特別是當C++引入可調用對象,或std::function。通過構造一個運算符爲()的類,您可以像對象一樣處理這樣的類的對象,並像函數指針一樣處理。

另一種替代方法是在C++ 11中引入lambda。您可以簡單地寫[A_variable_1, A_variable_2](auto parameter){ your code}以使用A中的變量和B中的您自己的變量。

相關問題