назначить элемент структуры для всего вектора структур?

Могу ли я сделать назначение как Шон ниже без создания новых функций назначения?

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, повышение допускается.

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);
}
2

Другие решения

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

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector