2

新しい割り当て関数を作成せずに、以下の 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 なし、ブーストは許可されます。

4

2 に答える 2

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);
}
于 2012-12-18T15:44:18.557 に答える
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が、それ以外の場合はブーストまたはC ++ 11からのものであるため、あなたが所有しています

于 2012-12-18T15:22:52.943 に答える