Re: How to pass a binary_function functor as an argument?
On Mar 27, 4:35 pm, t_litt...@yahoo.com wrote:
I want to pass a binary_function<double, double, double> functor
object as an argument into another function. So, I tried the
following which does not work with std::accumulate():
class BinFunctor : public std::binary_function<double, double, double>
{
public:
// I've tried with & without pure virtual method here, no luck.
virtual double operator()(const double& x, const double& y) const =
0;
};
class SumFunctor : public BinFunctor
{
public:
double operator()(const double& x, const double& y) const { return x
+y; }};
class ProductFunctor : public BinFunctor {...};
//... many other BinFunctor classes defined.
double foo(const vector<double>& vec, double init, BinFunctor& bf)
{
return std::accumulate(vec.begin(), vec.end(), init, bf); //
COMPILE ERROR HERE
// also tried: bf() bf::operator() nothing works
}
int main()
{
SumFunctor sf;
double res = foo(vec, 0, sf);
}
You have a couple problems here. First off, std::accumulate takes its
functor argument by value. By passing a reference to the base class,
you're slicing off the information in SumFunctor. Second, the functor
argument in std::accumulate doesn't have to be const, but your
operator() *is* const. That means that it can't be called on a non-
const object.
You might try doing something like this; make foo a template instead
of something that takes a base class reference:
(I tested this on Comeau online and it compiles fine)
#include <vector>
#include <numeric>
#include <functional>
// BinFunctor base was unnecessary:
class SumFunctor : public std::binary_function<double, double, double>
{
public:
// no const
double operator()(const double& x, const double& y) {
return x+y;
}
};
// other functors, derived from binary_function
template <class Func>
double foo(const std::vector<double>& vec, double init, Func bf)
{
return std::accumulate(vec.begin(), vec.end(), init, bf);
}
int main()
{
SumFunctor sf;
std::vector<double> vec;
double res = foo(vec, 0, sf);
}
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]