#include <iostream>
#include <vector>
#include <utility>
template <typename Container, typename ValueGetter, typename SizeType, typename T1, typename T2>
void Count(Container& c, ValueGetter valueGetter, T1&& t1, SizeType& out1, T2&& t2, SizeType& out2)
{
using GetVal = decltype(valueGetter(c[0]));
static_assert(std::is_same<std::decay_t<T1>, GetVal>::value, "Types don't match!");
static_assert(std::is_same<std::decay_t<T2>, GetVal>::value, "Types don't match!");
for (auto& elm : c)
{
const auto& val = valueGetter(elm);
if (val == t1) ++out1;
else if (val == t2) ++out2;
}
}
struct Foo
{
int GetI() { return i; }
int i = 0;
};
int main()
{
std::vector<Foo> f(10);
f[0].i = f[3].i = f[7].i = 37;
f[1].i = 1;
unsigned i0 = 0;
unsigned i37 = 0;
Count(f, [](auto& f) { return f.GetI(); },
0, i0,
37, i37);
std::cout << i0 << " " << i37;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dXRpbGl0eT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXIsIHR5cGVuYW1lIFZhbHVlR2V0dGVyLCB0eXBlbmFtZSBTaXplVHlwZSwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgp2b2lkIENvdW50KENvbnRhaW5lciYgYywgVmFsdWVHZXR0ZXIgdmFsdWVHZXR0ZXIsIFQxJiYgdDEsIFNpemVUeXBlJiBvdXQxLCBUMiYmIHQyLCBTaXplVHlwZSYgb3V0MikKewoJdXNpbmcgR2V0VmFsID0gZGVjbHR5cGUodmFsdWVHZXR0ZXIoY1swXSkpOwoJc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8c3RkOjpkZWNheV90PFQxPiwgR2V0VmFsPjo6dmFsdWUsICJUeXBlcyBkb24ndCBtYXRjaCEiKTsKCXN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPHN0ZDo6ZGVjYXlfdDxUMj4sIEdldFZhbD46OnZhbHVlLCAiVHlwZXMgZG9uJ3QgbWF0Y2ghIik7CgoJZm9yIChhdXRvJiBlbG0gOiBjKQoJewoJCWNvbnN0IGF1dG8mIHZhbCA9IHZhbHVlR2V0dGVyKGVsbSk7CgkJaWYgKHZhbCA9PSB0MSkgKytvdXQxOwoJCWVsc2UgaWYgKHZhbCA9PSB0MikgKytvdXQyOwoJfQp9CgpzdHJ1Y3QgRm9vCnsKCWludCBHZXRJKCkgeyByZXR1cm4gaTsgfQoJaW50IGkgPSAwOwp9OwoKaW50IG1haW4oKQp7CglzdGQ6OnZlY3RvcjxGb28+IGYoMTApOwoJZlswXS5pID0gZlszXS5pID0gZls3XS5pID0gMzc7CglmWzFdLmkgPSAxOwoKCXVuc2lnbmVkIGkwID0gMDsKCXVuc2lnbmVkIGkzNyA9IDA7CgoJQ291bnQoZiwgW10oYXV0byYgZikgeyByZXR1cm4gZi5HZXRJKCk7IH0sIAoJCQkJMCwgaTAsCgkJCQkzNywgaTM3KTsKCglzdGQ6OmNvdXQgPDwgaTAgPDwgIiAiIDw8IGkzNzsKfQ==