Один из способов сделать его более аккуратным - использовать Boost.Phoenix .Вы можете сократить до этого:
std::for_each(values.begin(), values.end(), lazy(avg)(arg1.getValue()));
Вот как это сделать.Первое, что вам нужно сделать, это сделать объект функции avg
ленивым.Простейший способ сделать это с помощью функции, определенной следующим образом:
template<class Function>
function<Function> lazy(Function x)
{
return function<Function>(x);
}
Следующее, что вам нужно сделать, это написать объект функции для getValue, который может быть ленивым, например:
struct get_value_impl
{
// result_of protocol:
template <typename Sig>
struct result;
template <typename This, typename T>
struct result<This(Value<T>&)>
{
// The result will be T
typedef typename T type;
};
template <typename V>
typename result<get_value_impl(V &)>::type
operator()(V & value) const
{
return value.getValue();
}
};
В-третьих, мы расширяем актеров феникса, используя наш класс get_value_impl
, поэтому у него будет метод getValue
, например:
template <typename Expr>
struct value_actor
: actor<Expr>
{
typedef actor<Expr> base_type;
typedef value_actor<Expr> that_type;
value_actor( base_type const& base )
: base_type( base ) {}
typename expression::function<get_value_impl, that_type>::type const
getValue() const
{
function<get_value_impl> const f = get_value_impl();
return f(*this);
}
};
Наконец, мы все это помещаемвместе, определив аргумент и передав его в алгоритм for_each:
expression::terminal<phoenix::argument<1>, value_actor> arg1;
std::for_each(values.begin(), values.end(), lazy(avg)(arg1.getValue()));