Taming C++, episode 3: templates, constraints and concepts