2013-03-06 92 views
0

我有一些困難的理解和貫徹了以下問題:函數調用數組元素

陣列中的存儲函數調用,即具有雙打的陣列和一個函數返回一個雙....我會喜歡在打電話時數組的一個元素,可以說myArray [0],它應該調用函數myArray,返回一個double。

double myFunction(){return mydouble} 

double myArray[3]; 
... 
cout<<myArray[2]<<endl; <- should call myFunction and return "mydouble" 
+0

請決定用C或C++ – fuz 2013-03-06 09:47:31

回答

5

對於C++查找std::function,對於C閱讀更多關於function pointers

函數指針也可以在C++中使用,但不像std::function那樣靈活。

C++溶液:

struct MyStruct 
{ 
    double myStructFunction() { return 2.0; } 
}; 

std::function<double()> myArray[3]; 

MyStruct myStructure; 

myArray[0] = []() { return 1.0; }; 
myArray[1] = std::bind(&MyStruct::myStructFunction, myStructure); 
myArray[2] = myFunction; 

for (int i = 0; i < 3; i++) 
    std::cout << "Calling `myArray[" << i << "]` : " << myArray[i]() << '\n'; 

對於myArray[0]分配查找lambda functions,以及用於分配myArray[1]查找std::bind

+0

我正要詢問使用的lambda函數的可能性'std :: function'我自己。你知道這是否適用於VC++或g ++以及哪個版本? (我知道它們都不支持C++ 11,但是有些東西在最新版本中可以工作 - 例如,我可以在VC++ 11中使用_simple_ lambdas。) – 2013-03-06 10:05:29

+0

@JamesKanze使用GCC 4.7.1編譯好。還使用ng版本3.3(主幹176337)進行測試。尚未用VC++測試過。 – 2013-03-06 10:13:34

+0

@JamesKanze剛剛用VC++ 2012 Express進行了檢查,在那裏工作得很好。雖然不能說2010年的任何事情。 – 2013-03-06 10:21:09

3

那麼你應該有函數指針數組,以實現這一目標:

typedef double(*MyArray)();

MyArray MA[3];

可以存儲與簽名double function_name()功能分成數組,如:

MA[0] = MyFunction;

cout<< MA[0]()<<endl;

+0

[這不是有效的聲明](http://ideone.com/sMTSDJ)。函數不能返回普通數組。 – 2013-03-06 09:57:53

+0

@Alexey Frunze對不起,這是錯誤的。現在它會起作用。 – 2013-03-06 10:07:16

1

在C你能做到這樣:

#include <stdio.h> 

/* Functions */ 
static double fn_0(void){return 0.;} 
static double fn_1(void){return 1.;} 
static double fn_2(void){return 2.;} 

int main(void) 
{ 
    /* Declaration */ 
    double (*pfn[])(void) = {fn_0, fn_1, fn_2}; 
    int i; 

    for (i = 0; i < 3; i++) { 
     printf("%f\n", pfn[i]()); /* Usage */ 
    } 
    return 0; 
} 
1
double myFunction() 
{ 
    double mydouble = 1; 
    return mydouble; 
} 

int main() 
{ 
    double myArray[3] = {0,0,0}; 
    for(int i=0;i<3;i++) 
    { 
    myArray[i] = myFunction(); 
    cout << myArray[i]; 
    } 

} 
1

的解決方案是不同的C和C++編寫,並且也不同在 C++ 11和前C + +11。

在所有的這些,你可以有指針的簡單數組 功能:

double (*array[3])() = { &f1, &f2, &f3 }; 

要調用函數:

std::cout << (*array[i])() << std::endl; 

這是非常有限的,因爲這意味着功能 問題不能依賴於任何其他數據。出於這個原因,它 在C往常一樣創建一個struct

struct F 
{ 
    double (*pf)(void*); 
    void* data; 
}; 

F array[3] = { { &f1, NULL }, { &f2, someData }, { &f3, NULL } }; 

std::cout << (*array[i].pf)(&data) << std::endl; 

(有,但是,很多情況下,特別是在數字 計算,如果是這種矯枉過正它主要是使用 回調。 。)

在C++中,還具有限定一個抽象基 類,與虛擬功能(其將在每個 派生類中重寫),並保存指針各種 派生類的實例的選項:

class F 
{ 
public: 
    virtual ~F() {} 
    virtual double operator()() const = 0; 
}; 

F const* array[3] = { &obj1, &obj2, &obj3 }; 

std::cout<< (*array[i])() << std::endl; 

最後,在C++ 11中,有一個標準對象std::function 它封裝了所有這些。 (然而,你必須自己去查看這個 然而,像大多數人一樣,我還沒有訪問 一個完全支持C++ 11的編譯器,所以一直無法 這個練習。)

1

怎麼樣,因爲這簡單的事?:

#include <iostream> 
#include <map> 

struct O 
{ 
    std::map<size_t,double(*)()> m; 
    double operator[](size_t index) 
    { 
    return m[index](); 
    } 
}; 

double mydouble = 1.25; 

double myFunction() 
{ 
    return mydouble; 
} 

int main() 
{ 
    O myArray; 
    myArray.m[2] = &myFunction; 
    std::cout << myArray[2] << std::endl; 
    return 0; 
} 

輸出(ideone):

1.25