所以這是混亂的解釋,但我會盡我所能。C++創建一個被指向作爲參數的函數
我有一個函數我的類中的一個函數指針作爲參數,我想要做的是將函數定義爲參數的一部分。即:
object->setFunctionPointer({string a = ""; return a;});
這可能嗎?如果是這樣,這是什麼適當的語法?
所以這是混亂的解釋,但我會盡我所能。C++創建一個被指向作爲參數的函數
我有一個函數我的類中的一個函數指針作爲參數,我想要做的是將函數定義爲參數的一部分。即:
object->setFunctionPointer({string a = ""; return a;});
這可能嗎?如果是這樣,這是什麼適當的語法?
在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;
}
-1您不需要C++ 11用於函數指針,並且lambda表達式與函數指針不兼容。 – concept3d 2014-10-09 06:03:16
@ concept3d他提到了內聯函數聲明,而不是函數指針。無狀態閉包*可以轉換爲函數指針(它們的**運算符()**)。 – Quentin 2014-10-09 06:09:48
感謝您指出這一點。那麼,有什麼選擇?或者有什麼辦法安全地將lambda轉換爲函數指針? – doptimusprime 2014-10-09 06:10:18
如果你的函數是一個類的成員,你不能把一個普通的函數指針來存儲它的地址。你需要的是一個代表;它們是方法的專用函數指針。在Internet上搜索C++委託,你應該找到很多例子。
(注:也許有靜態方法異常;我不記得了)
如果我們談論的是C++,你應該使用std ::函數,而不是函數指針。除非你正在與C API接口。
class Foo{
SetFunc(std::function<void(int)> func)
{
m_func = func;
}
private:
std::function<void(int)> m_func;
};
這是一個完整的例子。由於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
到標準輸出。
如何定義'setFunctionPointer'? – 2014-10-09 05:45:46
std :: function?使用Lamba? – 2014-10-09 05:46:59
如果這個函數接受'std :: function'那麼你可以使用'object-> setFunctionPointer([](){return std :: string(「」);});'。 –
cdhowie
2014-10-09 05:47:39