2014-10-09 82 views
-1

所以這是混亂的解釋,但我會盡我所能。C++創建一個被指向作爲參數的函數

我有一個函數我的類中的一個函數指針作爲參數,我想要做的是將函數定義爲參數的一部分。即:

object->setFunctionPointer({string a = ""; return a;}); 

這可能嗎?如果是這樣,這是什麼適當的語法?

+2

如何定義'setFunctionPointer'? – 2014-10-09 05:45:46

+2

std :: function?使用Lamba? – 2014-10-09 05:46:59

+2

如果這個函數接受'std :: function '那麼你可以使用'object-> setFunctionPointer([](){return std :: string(「」);});'。 – cdhowie 2014-10-09 05:47:39

回答

2

在C++ 11中,你可以做到。你可以使用C++ lambda(匿名函數)。

查看示例代碼在http://ideone.com/8ZTWSU

#include <iostream> 
using namespace std; 
typedef const char * (*funcptr)(); 
funcptr s; 
void setFuncPtr(funcptr t) 
{ 
    s = t; 
} 

int main() { 
    // your code goes here 
    setFuncPtr([]{return "Hello \n"; }); 
    printf("%s\n", s()); 
    return 0; 

}

+0

-1您不需要C++ 11用於函數指針,並且lambda表達式與函數指針不兼容。 – concept3d 2014-10-09 06:03:16

+1

@ concept3d他提到了內聯函數聲明,而不是函數指針。無狀態閉包*可以轉換爲函數指針(它們的**運算符()**)。 – Quentin 2014-10-09 06:09:48

+0

感謝您指出這一點。那麼,有什麼選擇?或者有什麼辦法安全地將lambda轉換爲函數指針? – doptimusprime 2014-10-09 06:10:18

0

如果你的函數是一個類的成員,你不能把一個普通的函數指針來存儲它的地址。你需要的是一個代表;它們是方法的專用函數指針。在Internet上搜索C++委託,你應該找到很多例子。

(注:也許有靜態方法異常;我不記得了)

0

如果我們談論的是C++,你應該使用std ::函數,而不是函數指針。除非你正在與C API接口。

class Foo{ 

SetFunc(std::function<void(int)> func) 
{ 
    m_func = func; 
} 

private: 
std::function<void(int)> m_func; 

}; 
0

這是一個完整的例子。由於C++ 11,這是要走的路:

#include<functional> 
#include<string> 
#include<iostream> 
using namespace std; 
class Object 
{ 
    public: 
     void setFunctionPointer(function<string(void)> function) 
     { 
      m_function = function; 
     } 
     string run() 
     { 
      return m_function();  
     } 
    private: 
     function<string(void)> m_function; 
}; 

int main(int argc, char**argv) 
{ 
    Object *object = new Object; 
    object->setFunctionPointer([]{string a = "FOO"; return a;}); // here is the function assignment 
    cout << object->run() << endl; 
    delete object; 
} 

當運行這個打印FOO到標準輸出。

相關問題