Boost logo

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