|
Boost Users : |
Subject: [Boost-users] [accumulator] extract_result during initialization
From: er (erwann.rogard_at_[hidden])
Date: 2009-03-01 12:58:29
Hi All,
I have an accumulator (a) that takes an initial value (x_), and another
(b), whose initial value (x_) depends on that of (a). I would have
thought that this is feasible because accumulator_set initializes (a)
before (b), but apparently b.x_ is initialized with a garbage value.
namespace impl
{
template<typename Sample,typename Id>
class accu_a_impl : public accumulator_base
{
public:
typedef Sample result_type;
template<typename Args>
accu_a_impl(Args const &args)
:x_(
args[kwd<Id>::value]
)
{
}
result_type result(dont_care) const
{
return x_;
}
private:
result_type x_;
};
}
namespace tag
{
template <typename Id = mpl::void_>
struct accu_a : depends_on<>
{
typedef accumulators::impl::accu_a_impl<mpl::_1,Id> impl;
};
}
namespace impl
{
template<typename Sample,typename Id0,typename Id1>
class accu_b_impl
: public accumulator_base
{
typedef tag::accu_a<Id1> a_type;
public:
typedef Sample result_type;
template<typename Args>
accu_b_impl(Args const &args)
:x_(
extract_result<a_type>(args[accumulator]) // faulty?
)
{
}
template<typename Args>
void operator ()(Args const &args)
{
// overrides initialization for the sake of testing
x_ = extract_result<a_type>(args[accumulator]);
}
private:
result_type x_;
};
}
namespace tag
{
template <typename Id0,typename Id1=mpl::void_>
struct accu_b
: depends_on<tag::accu_a<Id1> >
{
typedef accumulators::impl::accu_b_impl<mpl::_1,Id0,Id1> impl;
};
}
*.cpp
typedef mpl::size_t<0> id0;
typedef mpl::size_t<1> id1;
typedef double value_type;
typedef tag::accu_a<id0> a_type;
typedef tag::accu_b<id1,id0> b_type;
typedef accumulator_set<
value_type,
stats<
b_type
>
> set_type;
set_type set(
(
kwd<id0>::value = 0.9
)
);
std::cout << "a.x_=" << extract_result<a_type>(set) << std::endl;
std::cout << "b.x_=" << extract_result<b_type>(set) << std::endl;
set(0);
std::cout << "b.x_=" << extract_result<b_type>(set) << std::endl;
//Output:
//a.x_=0.9
//b.x_=0.1 // where 0.9 is expected
//b.x_=0.9
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net