gpt4 book ai didi

c++ - 成员变量和STL算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:52 26 4
gpt4 key购买 nike

#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;
}

有没有更简洁的方法来访问成员变量然后使用我上面的成员函数?我知道如何使用 tr1::bind 来做到这一点,但我需要在没有 boost 的情况下使用符合 C++03 的代码。

最佳答案

需要访问函数才能做到这一点绝对是不洁的。但这就是当前的 C++。

您可以尝试使用 boost::bind ,这很容易做到这一点,或者使用 for( vector<int>::const_iterator it = v.begin(); .....) 明确地迭代 vector 环形。我发现当仿函数的创建变得太麻烦时,后者通常会导致更清晰的代码。

或者,避开 boost,创建您自己的成员访问器 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 ) );

关于c++ - 成员变量和STL算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1451569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com