【发布时间】:2010-04-28 19:54:34
【问题描述】:
我有以下几种:
struct X { int x; X( int val ) : x(val) {} };
struct X2 { int x2; X2() : x2() {} };
typedef std::pair<X, X2> pair_t;
typedef std::vector<pair_t> pairs_vec_t;
typedef std::vector<X> X_vec_t;
我需要用来自X_vec_t 的值初始化pairs_vec_t 的实例。我使用以下代码,它按预期工作:
int main()
{
pairs_vec_t ps;
X_vec_t xs; // this is not empty in the production code
ps.reserve( xs.size() );
{ // I want to change this block to one line code.
struct get_pair {
pair_t operator()( const X& value ) {
return std::make_pair( value, X2() ); }
};
std::transform( xs.begin(), xs.end(), back_inserter(ps), get_pair() );
}
return 0;
}
我要做的是使用boost::bind 将我的复制块减少到一行。此代码不起作用:
for_each( xs.begin(), xs.end(), boost::bind( &pairs_vec_t::push_back, ps, boost::bind( &std::make_pair, _1, X2() ) ) );
我知道它为什么不工作,但我想知道如何在不声明额外函数和结构的情况下使其工作?
【问题讨论】:
-
不!这不是 Perl!我更喜欢可读的版本:)
-
如果最终结果看起来不可读,我不会在生产代码中使用
bind。老实说:)
标签: c++ boost boost-bind stl