#include #include #include #include #include using namespace boost::accumulators; typedef std::complex complex_t; template inline std::complex operator/ (std::complex const& a, unsigned long int b) { return std::complex (real (a)/b, imag (a)/b); } namespace boost { namespace accumulators { namespace impl { template struct abs_sqr_accumulator : accumulator_base { typedef typename Sample::value_type result_type; template abs_sqr_accumulator (Args const& args) {} template void operator () (Args const& args) { this->sum += real (args[sample] * conj (args[sample])); } template result_type result (Args const& args) const { return numeric::average (this->sum, count (args)); } result_type sum; }; }}} namespace boost { namespace accumulators { namespace tag { struct abs_sqr : depends_on< count > // depends_on<> to specify dependencies { // Define a nested typedef called 'impl' that specifies which // accumulator implements this feature. typedef accumulators::impl::abs_sqr_accumulator< mpl::_1 > impl; }; }}} template inline result_t get_abs_sqr (acc_t const& acc) { return abs_sqr (acc); } int main () { typedef std::complex value_t; typedef accumulator_set > acc_t; acc_t acc; typedef value_t::value_type scalar_t; double result = get_abs_sqr (acc); }