Re: Templated Lambda Functions?
On Apr 1, 4:48 pm, Andy Champ <no....@nospam.invalid> wrote:
[...]
Here's a worked, compilable example:
#include <set>
using namespace std;
void main()
{
set<int> coll;
for (size_t x = 0; x< 100; ++x) coll.insert(rand());
auto howManyMake1000 = [&](set<int>::iterator first,
set<int>::iterator last)->size_t
{
int x = 0;
int count = 0;
for (set<int>::iterator where = first; where != last && x
< 1000; ++where,++count)
x += *where;
return count;
};
size_t howMany = howManyMake1000(coll.begin(), coll.end());
}
In my real code the lambda needs access to a bunch of local variables to
do its magic - not least the logging object! - and I want another line
which the equivalent of
size_t howManyEnd = howManyMake1000(coll.rbegin(), coll.rend());
Since you clearly need a named object here I don't see lambdas as the
solution. That said, I see that it would be somewhat convenient to
declare a template function locally, but this is unfortunately not
allowed.
The only reason you need a template here is to handle the different
iterator types. If you can separate the iteration from the rest of the
logic of your function and reformulate the latter as a functor, then
you can call upon the standard library to do the iteration. You can
pass the functor whatever state and references it needs to do its job
(including a reference to your logging object).
For example:
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <iostream>
using namespace std;
int main () {
vector <int> c (10);
generate (c.begin (), c.end (), &rand);
for_each (c.begin (), c.end (), [] (int i) {cout << i << " ";});
cout << endl;
struct WithinPartialSum {
int target_sum, partial_sum;
WithinPartialSum (int sum)
: target_sum (sum), partial_sum (0) {}
bool operator () (int i)
{return (partial_sum += i) <= target_sum;}
};
const int s = 100000;
int nf = count_if (c.begin (), c.end (), WithinPartialSum (s));
int nb = count_if (c.rbegin (), c.rend (), WithinPartialSum (s));
cout << "Number of items within partial sum " << s << ": \n"
<< "forwards: " << nf << ", backwards: " << nb << endl;
cin.get (); // pause
return 0;
}
Regards,
Vidar Hasfjord
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]