Я использую буферы протокола Google в приложении обмена сообщениями. Прото часто вложены в несколько уровней, и мы воспользовались советом Google и сделали их необязательными. Прототипы могут описывать много разных типов перекрывающихся сообщений - то есть сообщение типа == X должно содержать член my_X, тип == Y должен содержать my_Y. Кроме того, определенные комбинации полей накладывают другие ограничения на то, какие поля должны присутствовать и какие значения они должны иметь. Изменение структуры прото выходит за рамки того, что я могу сделать.
Прямо сейчас, вся эта проверка в беспорядке утверждений if..else. Если случаи не пересекаются, это может быть осуществимо, но случаи проверки могут накладывать различные ограничения на определенное поле, поэтому оно может быть довольно уродливым. Есть ли способ лучше? Моя цель - сделать код более понятным. Я немного изучил функторы / предикаты, и кажется, что это может упростить проблему, но все равно кажется, что это будет беспорядок.