#include <functional>
#include <iostream>
#include <vector>


    class Test
    {
    public:
          Test (int testType) : m_testType(testType) {};
          void blah() { std::cout << "BLAH! " << m_testType << std::endl; }
          void blahWithParmeter(std::string p) { std::cout << "BLAH1! Parameter=" << p << std::endl; }
          void blahWithParmeter2(std::string p) { std::cout << "BLAH2! Parameter=" << p << std::endl; }
          
          private:
             int m_testType;
          
    };
    
    class Bim
    {
    public:
          void operator()(){ std::cout << "BIM!" << std::endl; }
    };

    void boum() { std::cout << "BOUM!" << std::endl; }


int main()
{
    // store the member function of an object:
    Test test(7);  
    //std::function< void() > callback = std::bind( &Test::blah, test );
    std::function< void() > callback = std::bind( &Test::blah, test );
    callback();

    // store a callable object (by copy)
    callback = Bim{};
    callback();

    // store the address of a static funtion
    callback = &boum;
    callback();

    // store a copy of a lambda (that is a callable object)
    callback = [&]{ test.blah(); }; // might be clearer than calling std::bind()
    callback();
    
    // example of callback with parameter using a vector
    typedef std::function<void(std::string&)> TstringCallback;
    
    std::vector <TstringCallback> callbackListStringParms;
    callbackListStringParms.push_back( [&] (const std::string& tag) { test.blahWithParmeter(tag); }); 
    callbackListStringParms.push_back( [&] (const std::string& tag) { test.blahWithParmeter2(tag); }); 
    
    std::string parm1 = "parm1";
    std::string parm2 = "parm2";
    int i = 0;
    for (auto cb : callbackListStringParms ) 
    {
        ++i;
        if (i == 1)
            cb(parm1);
        else
            cb(parm2);
        
        }
}      