#include <iostream>
#include <stdint.h>
#include <thread>
#include <list>

class ReaderA
{
public:
    ReaderA() {}
    ~ReaderA() {}

    template <typename T>
    void read(std::list<T> *stack) = 0;

};

class Reader : public ReaderA
{
public:
    Reader() {}
    ~Reader() {}

    template <typename T>
    void read(std::list<T> *stack)
    {
        std::cout << "i'm supposed to read";
        stack.push_back(1); //lets push some data
    }

};

class Caller
{
public:
    Caller(ReaderA *reader) : _reader(reader)
    {

    }

    ~Caller() {}

    template <typename T>
    void call(std::list<T> *stack)
    {
        std::thread *thread = new std::thread(
                    static_cast<void (ReaderA::*)(std::list<T> *)>(&ReaderA::read),
                    _reader, stack);
    }

protected:
    ReaderA *_reader;
};

int main()
{
    Reader *r = new Reader();
    Caller *c = new Caller(r);
    std::list<uint32_t> *list = new std::list<uint32_t>();
    
    c->call(list);
    return (0);
}
