2009-04-14 80 views
4

它們的含義是什麼?
我從來沒有使用過任何東西,我也看不到我自己需要使用它們。
我錯過了一些關於他們的東西,還是他們幾乎沒用?

編輯:我不很瞭解他們,所以關於他們的描述可能是必要的......在C++中綁定指向成員操作符的指針

+0

是http://stackoverflow.com/questions/654853/why-would-one-use-function-pointers-to-member-method-in-c你在找什麼? – nevets1219 2009-04-14 07:01:37

+0

不,更具體地說,。*和 - > *運算符。 – DeadHead 2009-04-14 07:05:41

+0

我懷疑不是,我想他是在談論指向成員操作員的指針(例如operator +) – 2009-04-14 07:05:58

回答

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);