#include <iostream>
#include <map>
#include <vector>
#include <typeindex>
struct RequestA{};
struct RequestB{};
struct RequestC{};
class RequestHandler {
public:
void tick()
{
std::cout<<"tick called"<<std::endl;
}
private:
std::vector<RequestA> queueA;
std::vector<RequestB> queueB;
std::vector<RequestC> queueC;
//create std::map - STEP 1
std::map<std::type_index, void*> myMap{{typeid(RequestA), &queueA},
{typeid(RequestB), &queueB},
{typeid(RequestC), &queueC}};
public:
//create member function template - STEP 2
template<typename T> void add(T Arg);
};
template<typename T> void RequestHandler::add(T Arg) // - STEP 3
{
std::cout << "add called on " <<typeid(Arg).name() << std::endl;//just for debugging purposes
std::cout << "size before push_back "<< (*static_cast<std::vector<decltype(Arg)>*>(myMap.at(typeid(Arg)))).size()<<std::endl;//just for debugging
(*static_cast<std::vector<decltype(Arg)>*>(myMap.at(typeid(Arg)))).push_back(Arg);
std::cout << "size after push_back "<< (*static_cast<std::vector<decltype(Arg)>*>(myMap.at(typeid(Arg)))).size()<<std::endl;
std::cout<<"--------------------------------------"<<std::endl;
}
int main()
{
RequestA A;
RequestB B;
RequestC C;
RequestHandler rq;
//call RequestHandler's add method simulating the requests
rq.add(A);
rq.add(B);
rq.add(B);
rq.add(C);
}