У вас описано одно из лучших решений: M классов по N методов. Дублирования легко избежать, реализовав всё по 1 разу, а в остальных методах просто вызывать уже реализованные. Ваша задача для ООП стиля гуглится по фразе «множественный полиморфизм». Кажется, у Меерса предлагалось решение в виде map<key, function>, в которую просто записываются указатели на функции так, как вам уже предлагали выше.