В настоящее время я создаю игровой движок C ++ в качестве учебного упражнения и включаю исключения в менее критичные для производительности разделы. Я в основном разработчик PHP и Ruby, поэтому я привык регулярно объявлять новые классы исключений, используя простой синтаксис, подобный следующему:
class SomeSubSystemException < Exception; end
или же
class SomeSubSystemException extends Exception {};
Есть ли простой синтаксис для этого в C ++, или я собираюсь обработать исключения неправильным способом для проектов C ++? В настоящее время я должен сделать следующее для каждого класса исключений, что заставляет меня хотеть не определять очень много:
class SubSystemException : public MainException {
SubSystemException(std::string& msg) : MainException(msg) {}
};
Заранее спасибо!
Определите макрос, который сделает это за вас.
#define NEW_EXC(Derived, Base) class Derived : Base {\
Derived(const std::string& msg) : Base(msg) {}
NEW_EXC(SubSystemException, MainException);
#undef NEW_EXC
Готово.
Хотя я согласен с комментарием Бо Перса, в котором говорится, что это не будет вашим основным источником boilaerplate, вот еще один способ этого:
использование CRTP
template<class T>
class MainException : public std::runtime_error{
private:
MainException(std::string const& msg):std::runtime_error(msg){ }
public:
static MainException<T> create(std::string const& msg){
return MainException<T>(msg);
}
};
//Usage:
class MyException : public MainException<MyException> {};
void foo(){
MyException::create(std::string("Foo"));
}