2011-08-31 63 views
1

是否有一個STL方法/升壓類如:適配器的指針成員字段

template<class S, class T> 
class mem_mem : std::unary_function<T, S> 
{ 
public: 
    mem_mem(S T::*_m) : m(_m) {} 
    S operator()(T &t) const { 
    return t .* m; 
    } 
    const S operator()(const T &t) const { 
    return t .* m; 
    } 
private: 
    S T::*m; 
}; 

它類似於mem_fun但對於字段。

+4

什麼'但是我'?完成那個句子。 – Nawaz

+0

@Nawaz:對不起。我只是想說我做了一些搜索。對那些投票結束這個問題的人來說:你是否介意解釋爲什麼這個問題「不是真正的問題」?我試着多次閱讀FAQ,但我沒有看到這個問題是如何「不是真正的問題」。當然,它有一個確定的答案,並且是主題(基本上它是問題「C++標準庫是否具有函數X以及它是如何被調用的」)。 –

+0

如果你留下*不完整的句子,沒人會理解你想要的。這就是爲什麼它被投票決定關閉這個話題的原因。這很容易理解,不是嗎? – Nawaz

回答

1

您可以使用此boost::bindboost::mem_fn。如果傳入的成員是字段的成員,則boost::bind充當函數返回數據成員。

#include <vector> 
#include <boost/bind.hpp> 
#include <iostream> 
#include <iterator> 


struct X { 
    X(): a(0) {}; 
    X(int i) : a(i) {}; 


    int a; 
}; 


int main() { 

    std::vector<X> v1; 
    v1.reserve(10); 
    for(int i = 0; i < 10; ++i) { 
    v1.push_back(X(i)); 
    } 

    std::vector<int> v2(10); 
    std::transform(v1.begin(), v1.end(), v2.begin(), boost::bind(&X::a, _1)); 
    // or std::transform(v1.begin(), v1.end(), v2.begin(), boost::mem_fn(&X::a)); 
    std::copy(v2.begin(), v2.end(), std::ostream_iterator<int>(std::cout,",")); 
    std::cout << std::endl; 
} 
1

boost::bind具有mem_fn它看起來像你所感興趣的東西。