#include <iostream>
#include <map>
#include <vector>
#include <memory>
#include <cctype>

class ICommand
{
public:
	virtual ~ICommand(){}
	virtual void Execute() = 0;
};

class ProcessSingleStatusCommand : public ICommand
{
public:
	void Execute()
	{
		std::cout << "ProcessSingleStatusCommand" << std::endl;
	}
};

class ProcessMarriedStatusCommand : public ICommand
{
public:
	void Execute()
	{
		std::cout << "ProcessMarriedStatusCommand" << std::endl;
	}
};

int main() 
{
	typedef std::map<char, std::unique_ptr<ICommand>> TCommandMap;
	TCommandMap commandMap;
	
	commandMap.insert(std::make_pair('s', std::unique_ptr<ICommand>(new ProcessSingleStatusCommand())));
	commandMap.insert(std::make_pair('m', std::unique_ptr<ICommand>(new ProcessMarriedStatusCommand())));
	
	// Assume we've captured inputs 's' & 'M'
	std::vector<char> inputs {'s', 'M'};
	
	for (const auto& input : inputs)
	{
		auto it = commandMap.find(tolower(input));
		
		if (it != commandMap.end())
		{
			it->second->Execute();
		}
	}
	
	return 0;
}