成员变量和STL算法

4 c++ stl

#include <vector>
#include <functional>
#include <algorithm>
using namespace std;

struct Foo
{
    int i;
    double d;
    Foo(int i, double d) :
        i(i),
        d(d)
    {}
    int getI() const { return i; }
};

int main()
{
    vector<Foo> v;
    v.push_back(Foo(1, 2.0));
    v.push_back(Foo(5, 3.0));

    vector<int> is;

    transform(v.begin(), v.end(), back_inserter(is), mem_fun_ref(&Foo::getI));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是否有更简洁的方法来访问成员变量然后使用像我上面的成员函数?我知道如何使用tr1 :: bind来完成它,但是我需要没有boost的C++ 03兼容代码.

xto*_*ofl 8

为了做到这一点,需要一个访问器功能是绝对不洁净的.但那是当前的C++.

您可以尝试使用boost::bind,这很容易,或使用for( vector<int>::const_iterator it = v.begin(); .....)循环显式迭代向量.当发现仿函数的创建变得太麻烦时,我发现后者通常会产生更清晰的代码.

或者,避开提升,创建自己的member-accessor shim函数.

template< typename T, typename m > struct accessor_t {
   typedef m (T::*memberptr);

   memberptr acc_;

   accessor_t( memberptr acc ): acc_(acc){}
   // accessor_t( m (T::*acc) ): acc_(acc){}
   // m (T::*acc_);

   const m& operator()( const T& t ) const { return (t.*acc_); }
   m&       operator()( T& t       ) const { return (t.*acc_); }
};

template< typename T, typename m > accessor_t<T,m> accessor( m T::*acc ) {
   return accessor_t<T,m>(acc);
}

...

transform( v.begin(), v.end(), back_inserter(is), accessor( &C::i ) );
Run Code Online (Sandbox Code Playgroud)