#include <iostream>
#include <algorithm>
#include <functional>
#include <iterator>
#include <list>
#include <iterator>
using namespace std;
class Inspection
{
public:
template<class Iterator>
static typename std::iterator_traits<Iterator>::pointer check
(
Iterator first, // starting iterator position
Iterator last, // ending iterator position (exclusive)
int input // check-value
)
{
typedef const typename std::iterator_traits<Iterator>::reference const_reference;
Iterator it = std::find_if(first, last,
[&input](const_reference obj) { return obj.checkExists(input); });
return (it != last ? &*it : nullptr);
}
};
//////////////////////////////////////////////////////////////////////
class Property
{
private:
int value;
public:
Property(int arg) : value(arg) {};
bool checkExists(int arg) const { return value == arg; }
int getValue() const { return value; };
};
//////////////////////////////////////////////////////////////////////
int main()
{
std::list<Property> props;
for (int i=0;i<10;++i)
props.push_back(Property(i));
Property* p = Inspection::check(props.begin(), props.end(), 4);
if (p != nullptr)
cout << "Found value: " << p->getValue() << endl;
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGl0ZXJhdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgSW5zcGVjdGlvbgp7CnB1YmxpYzoKICAgIHRlbXBsYXRlPGNsYXNzIEl0ZXJhdG9yPgogICAgc3RhdGljIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6cG9pbnRlciBjaGVjawogICAgKAogICAgICAgIEl0ZXJhdG9yIGZpcnN0LCAgICAgLy8gc3RhcnRpbmcgaXRlcmF0b3IgcG9zaXRpb24KICAgICAgICBJdGVyYXRvciBsYXN0LCAgICAgIC8vIGVuZGluZyBpdGVyYXRvciBwb3NpdGlvbiAoZXhjbHVzaXZlKQogICAgICAgIGludCBpbnB1dCAgICAgICAgICAgLy8gY2hlY2stdmFsdWUKICAgICkKICAgIHsKICAgICAgICB0eXBlZGVmIGNvbnN0IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6cmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKICAgICAgICBJdGVyYXRvciBpdCA9IHN0ZDo6ZmluZF9pZihmaXJzdCwgbGFzdCwKICAgICAgICAgICAgWyZpbnB1dF0oY29uc3RfcmVmZXJlbmNlIG9iaikgeyByZXR1cm4gb2JqLmNoZWNrRXhpc3RzKGlucHV0KTsgfSk7CiAgICAgICAgcmV0dXJuIChpdCAhPSBsYXN0ID8gJippdCA6IG51bGxwdHIpOwogICAgfQp9OwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpjbGFzcyBQcm9wZXJ0eQp7CnByaXZhdGU6CiAgICBpbnQgdmFsdWU7CiAgICAKcHVibGljOgogICAgUHJvcGVydHkoaW50IGFyZykgOiB2YWx1ZShhcmcpIHt9OwogICAgCiAgICBib29sIGNoZWNrRXhpc3RzKGludCBhcmcpIGNvbnN0IHsgcmV0dXJuIHZhbHVlID09IGFyZzsgfQogICAgaW50IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH07Cn07Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgppbnQgbWFpbigpCnsKICAgIHN0ZDo6bGlzdDxQcm9wZXJ0eT4gcHJvcHM7CiAgICAKICAgIGZvciAoaW50IGk9MDtpPDEwOysraSkKICAgICAgICBwcm9wcy5wdXNoX2JhY2soUHJvcGVydHkoaSkpOwogICAgCiAgICBQcm9wZXJ0eSogcCA9IEluc3BlY3Rpb246OmNoZWNrKHByb3BzLmJlZ2luKCksIHByb3BzLmVuZCgpLCA0KTsKICAgIGlmIChwICE9IG51bGxwdHIpCiAgICAgICAgY291dCA8PCAiRm91bmQgdmFsdWU6ICIgPDwgcC0+Z2V0VmFsdWUoKSA8PCBlbmRsOwogICAgCiAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwp9