我可以在下指定shawn而不创建新的分配函数吗?
struct S
{
int one;
double two;
}
vector< S > v( 10 );
std::transform( begin( v ), end( v ), begin( v ), /*some how bind S::two to 10., for example*/ );
结果:所有v
元素都有S:two
== 10,S::one
具有std::transform
之前的值
没有C ++ 11,允许加速。
答案 0 :(得分:2)
我写了一个通用的setter
,你可以设置 结构的任何成员。
例如,如果您想将成员two
设置为特定值10.0
,那么您必须写下这个:
std::transform(v.begin(), v.end(), v.begin(), make_setter(&S::two, 10.0));
你已经完成了。
以下是setter
和make_setter
的实施:
template<typename C, typename M>
class setter
{
M C::*m_member;
M m_value;
public:
setter(M C::*member, M value) : m_member(member), m_value(value) {}
C operator()(C item)
{
item.*m_member = m_value;
return item;
}
};
template<typename C, typename M>
setter<C, M> make_setter(M C::*member, M value)
{
return setter<C,M>(member, value);
}
答案 1 :(得分:1)
struct set_two {
double v;
set_two(double v_) : v(v_) { }
S operator()(S s) const {
s.two=v;
return s;
}
};
std::transform( begin(v), end(v), begin(v), set_two(10.0) );
虽然我假设您拥有begin
和end
,否则它来自boost或C ++ 11