
Pavol Droba wrote:
Hi,
First of all, I'd like to thank you for the nice benchmarks.
Now my comments to your patches:
1.) const Predicate& Pred Although this change can bring a performance benefits, it has one big drawback. You cannot pass an ordinary C function as predicate. At least not in VC++ 7.1
Following code will not work:
int func(int a) { return a+2; }
template<typename TFunc> int sum(TFunc f, unsigned int a) { int acum=0; for(unsigned int i=0; i<a; i++) { acum+=f(i); }
return acum; }
...
sum(func, 1000);
It is surprising for me. VC++ seems to need overloads: int func(int a) { return a+2; } struct func_t { int operator()(int a) const { return a+2; } }; template<typename TFunc> int sum_aux(TFunc& f, unsigned int a) { int acum=0; for(unsigned int i=0; i<a; i++) { acum+=f(i); } return acum; } template<typename TFunc> int sum(TFunc const& f, unsigned int a) { return ::sum_aux(f, a); } template<typename TFunc> int sum(TFunc& f, unsigned int a) { return ::sum_aux(f, a); } void test() { ::sum(::func, 1000); ::sum(&::func, 1000); ::sum(::func_t(), 1000); } Looks working well under gcc and vc. But, the forwarding problem will come... -- Shunsuke Sogame