#include <iostream>
#include <string>
#include <functional>
#include <vector>
class Elem
{
private :
int value_;
std:: function < void ( const std:: string & ) > callback_;
public :
Elem( int v, std:: function < void ( const std:: string & ) > cb)
: value_{ v} , callback_{ cb}
{ }
void some_function( ) const
{
callback_( "Elem with value " + std:: to_string ( value_) ) ;
}
} ;
class Cont
{
private :
std:: vector < Elem> elements_;
void private_function( const std:: string & s)
{
std:: cout << "In private function: " << s << '\n ' ;
}
public :
void add_value( const int v)
{
elements_.push_back ( Elem( v, std:: bind ( & Cont:: private_function , this , std:: placeholders :: _1) ) ) ;
}
std:: vector < Elem> :: const_iterator begin( ) const
{
return std:: begin ( elements_) ;
}
std:: vector < Elem> :: const_iterator end( ) const
{
return std:: end ( elements_) ;
}
} ;
int main( )
{
Cont c;
// Add some elements
for ( int i = 1 ; i <= 10 ; ++ i)
c.add_value ( i) ;
// Call callback function
for ( const auto & e : c)
e.some_function ( ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KCmNsYXNzIEVsZW0Kewpwcml2YXRlOgogICAgaW50IHZhbHVlXzsKICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYpPiBjYWxsYmFja187CgpwdWJsaWM6CiAgICBFbGVtKGludCB2LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmKT4gY2IpCiAgICAgICAgOiB2YWx1ZV97dn0sIGNhbGxiYWNrX3tjYn0KICAgIHt9CgogICAgdm9pZCBzb21lX2Z1bmN0aW9uKCkgY29uc3QKICAgIHsKICAgICAgICBjYWxsYmFja18oIkVsZW0gd2l0aCB2YWx1ZSAiICsgc3RkOjp0b19zdHJpbmcodmFsdWVfKSk7CiAgICB9Cn07CgpjbGFzcyBDb250CnsKcHJpdmF0ZToKICAgIHN0ZDo6dmVjdG9yPEVsZW0+IGVsZW1lbnRzXzsKCiAgICB2b2lkIHByaXZhdGVfZnVuY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHMpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJJbiBwcml2YXRlIGZ1bmN0aW9uOiAiIDw8IHMgPDwgJ1xuJzsKICAgIH0KCnB1YmxpYzoKICAgIHZvaWQgYWRkX3ZhbHVlKGNvbnN0IGludCB2KQogICAgewogICAgICAgIGVsZW1lbnRzXy5wdXNoX2JhY2soRWxlbSh2LCBzdGQ6OmJpbmQoJkNvbnQ6OnByaXZhdGVfZnVuY3Rpb24sIHRoaXMsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpKTsKICAgIH0KCiAgICBzdGQ6OnZlY3RvcjxFbGVtPjo6Y29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBzdGQ6OmJlZ2luKGVsZW1lbnRzXyk7CiAgICB9CgogICAgc3RkOjp2ZWN0b3I8RWxlbT46OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIHN0ZDo6ZW5kKGVsZW1lbnRzXyk7CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIENvbnQgYzsKCiAgICAvLyBBZGQgc29tZSBlbGVtZW50cwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMTA7ICsraSkKICAgICAgICBjLmFkZF92YWx1ZShpKTsKCiAgICAvLyBDYWxsIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICBmb3IgKGNvbnN0IGF1dG8mIGUgOiBjKQogICAgICAgIGUuc29tZV9mdW5jdGlvbigpOwp9Cg==