它們的含義是什麼?
我從來沒有使用過任何東西,我也看不到我自己需要使用它們。
我錯過了一些關於他們的東西,還是他們幾乎沒用?
編輯:我不很瞭解他們,所以關於他們的描述可能是必要的......在C++中綁定指向成員操作符的指針
4
A
回答
10
甲PMF(成員函數指針)是像一個正常的(靜態)函數指針,除了,因爲非靜態成員函數所需要的this
對象被指定,PMF調用語法(.*
或->*
)允許指定this
對象(在左側)。
這裏的(正在使用注意與.*
操作者的 「魔力」 行:(lhs.*opit->second)(...)
,以及用於創建PMF,&class::func
語法):在使用保偏光纖的一個例子
#include <complex>
#include <iostream>
#include <map>
#include <stack>
#include <stdexcept>
#include <string>
namespace {
using std::cin; using std::complex; using std::cout;
using std::invalid_argument; using std::map; using std::stack;
using std::string; using std::underflow_error;
typedef complex<double> complexd;
typedef complexd& (complexd::*complexd_pmf)(complexd const&);
typedef map<char, complexd_pmf> opmap;
template <typename T>
typename T::reference top(T& st) {
if (st.empty())
throw underflow_error("Empty stack");
return st.top();
}
}
int
main()
{
opmap const ops{{'+', &complexd::operator+=},
{'-', &complexd::operator-=},
{'*', &complexd::operator*=},
{'/', &complexd::operator/=}};
char op;
complexd val;
stack<complexd> st;
while (cin >> op) {
opmap::const_iterator opit(ops.find(op));
if (opit != ops.end()) {
complexd rhs(top(st));
st.pop();
// For example of ->* syntax:
complexd& lhs(top(st)); // complexd* lhs(&top(st));
(lhs.*opit->second)(rhs); // (lhs->*opit->second)(rhs);
cout << lhs << '\n'; // cout << *lhs << '\n';
} else if (cin.unget() && cin >> val) {
st.push(val);
} else {
throw invalid_argument(string("Unknown operator ") += op);
}
}
}
[Download]
這是一個簡單的RPN計算器,它使用複數而不是實數(主要是因爲std::complex
是帶有重載運算符的類類型)。我用clang測試了這個;您的里程可能會因其他平臺而異。
輸入的格式應該是(0,1)
。空格是可選的,但可以添加以提高可讀性。
4
綁定指向一個功能是在各種情況下非常有用的。基本上,它允許您將函數作爲變量來引用,這使您可以在運行時選擇要調用的函數。
一個用於此的是「回調」。假設我想讓一些後臺進程工作一段時間,並告訴我們什麼時候完成(所以我們可以更新GUI或其他)。但有時候,我們可能希望這個後臺進程調用一個方法,有時我們希望它調用一個不同的方法。我們可以編寫它,而不是編寫這個後臺進程的兩個版本,以便後臺進程接收一個指向我們希望它「回調」的函數的指針。然後,當這個過程完成時,它會首先調用它提供的功能。
基本上,它只是讓你有一個更靈活的決定調用哪種方法。這樣就和多態性非常相似。事實上,在幕後,我相信C++使用函數指針來促進多態性(通過爲每個類存儲指向函數的不同指針表)
1
如果我正確理解你的問題。爲什麼不?
struct test
{
test* operator->()
{
std::cout << "test::operator->";
return this;
}
};
test tt;
boost::bind(&test::operator ->, _1)(tt);
相關問題
- 1. C++指向成員的指針(指向成員的基類)
- 2. C++指向成員的指針
- 3. C++指向成員的指針
- 4. 指向成員的指針
- 5. 將指針指向成員函數作爲函數指針
- 6. 綁定void *指向C++/Cli基本類型指針的指針
- 7. C++指定指向指針
- 8. C - 傳遞和操作字符指針和指針指針
- 9. 指針在C++成員
- 10. 指向類成員的指針
- 11. CURLOPT_WRITEFUNCTION指向成員函數的指針
- 12. 指向成員函數的指針
- 13. 指向類內成員的指針
- 14. 指向結構成員的指針
- 15. 指向成員函數的指針
- 16. 使用指針指針數組來操作它指向的指針(C++)
- 17. 處理指向C++層級中的成員函數的指針
- 18. 將指針指向成員函數作爲指向C函數的指針是一種很好的做法
- 19. COM互操作和編組指針指向一個接口的指針在C#
- 20. 在指針上使用成員訪問操作符
- 21. 設置結構的指針成員,從指針指向結構的指針
- 22. 成員指向成員對象和聲明順序的指針
- 23. C++成員函數指針
- 24. C++成員函數指針
- 25. 在C++中爲指針指定指針
- 26. 在指向成員函數簽名的指針中缺少「this」指針
- 27. C++指向const類成員問題的指針
- 28. 指針指向在C的字符串指針數組++
- 29. ++操作符在指針中的行爲
- 30. 如何定義指向類成員函數的指針
是http://stackoverflow.com/questions/654853/why-would-one-use-function-pointers-to-member-method-in-c你在找什麼? – nevets1219 2009-04-14 07:01:37
不,更具體地說,。*和 - > *運算符。 – DeadHead 2009-04-14 07:05:41
我懷疑不是,我想他是在談論指向成員操作員的指針(例如operator +) – 2009-04-14 07:05:58