Пока все исключения, которые вы используете таким образом, являются производными от общего базового класса, например,
struct payload_base_class : public std::exception
{
};
, тогда я вижу, что ваш шаблон может быть полезен. Я предписал эту общность, чтобы вы могли различать guish между вашими return
исключениями вкуса и исключениями, которые вы должны обрабатывать более стандартным способом.
(Возможно, вы не захотите std::exception
в качестве базового класса, иначе ваши исключения могут быть непреднамеренно перехвачены. Это для вас.)
Этот метод имеет преимущество перед подходом std::variant
в том, что вы можете добавлять новые типы return
без необходимости изменения шаблона std::variant
; выполнение этого может привести к серьезным изменениям.
C ++ разработан, чтобы разрешать такие эксплойты. Тот факт, что люди не имели в виду этот вариант использования при разработке исключений, не делает этот подход незаконным. Шаблон метапрограммирования тоже вырос непреднамеренно.