Насколько правильным было бы использовать такую структуру приложения:
Имеется один тип данных (Oper), объекты которого считываются из файла. Однако, в файле они представлены существенно по-разному.
Допустим, мы считываем операции какого-либо ассемблера.
Насколько красиво выглядел бы такой подход к считыванию: создаются отдельные классы, каждый класс расчитан на то, чтобы заполнить объект типа Oper по ассемблеру конкретной операции. Например, для операции call — class CallFiller и т.п. Но каждый такой класс умеет по строке отличить, его ли это тип данных.
Реализовать такое можно было бы также по-разному.
Например, создать абстрактный базовый класс Filler для всех конкретных классов считывания операции. Потом создать массив указателей по Filler по одному на конкретную реализацию. И при считывании строки с одной операцией проходить по массиву и предлагать каждому классу распарсить строчку, пока кто-то из них не согласится распарсить.
Но если лень заполнять массив вручную, то можно занумеровать все классы парсеров операций при помощи специализации шаблона по константе. И сделать рекурсивную шаблонную функцию, которая заполняла бы массив сама.
А, с другой стороны, если уж дело дошло до метопрограммирования, то можно и вообще не использовать массив, а использовать эту шаблонную функцию с рекурсивным вызовом, которая предлагает каждому классу, обращаясь через его номер, распарсить строчку. А в классах сделать статические методы и не создавать их экземпляров.