避免接近相同类定义的宏

时间:2017-01-11 14:30:40

标签: c++

我有一个例外的基类:

class BaseException : public std::runtime_error
{
public:

    BaseException(int Code, std::string Msg) : runtime_error(Msg);

    //...etc
};

在每个需要例外的类中,我嵌入了一个继承自Exception的{​​{1}}类:

BaseException

现在我可以在class Foo { public: class Exception : public BaseException { public: Exception(int Code, std::string OptMsg = "") : BaseException(Code, OptMsg); enum { Fire, Flood, Aliens }; }; //...etc }; throw(Exception::Fire)并按基类或Foo捕捉并与Foo::Exception&进行比较。

Foo::Exception::Fire类定义几乎完全相同,只有枚举内容发生变化。因为DRY,我正在考虑编写一个允许这样的宏:

Exception

然而,宏在C ++中不受欢迎。还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

怎么样:

template <typename T>
struct Exception : BaseException
{
     Exception(int Code, std::string OptMsg = "") : BaseException(Code, OptMsg);
};

class Foo
{
public:

    using Exception = ::Exception<Foo>;    
    enum ExceptionCodes
    {
        Fire,
        Flood,
        Aliens
    };

    //...etc
};

(编译器看不见)

唯一的区别是您必须引用Foo::FireFoo::ExceptionCodes::Fire

您可以不使用using语句,只需参考Exception<Foo>

答案 1 :(得分:2)

你可以&#34;继承&#34;使用BaseException关键字的using构造函数,而不是手动重新实现它们。这可以节省你一些打字。其余的样板很少,所以我个人不会担心它。

struct Foo {
  struct Exception : BaseException {
    using BaseException::BaseException;
    enum {
      Fire,
      Flood,
      Aliens
    };
  };
};