如何自动化类声明?

时间:2016-01-24 22:26:52

标签: c++ c++11

我有一些来自std::exceptionstd::runtime_error的例外情况。唯一的方法是构造函数explicit MyExceptionX(const char *text = "") : std::exception(text) {}。有没有办法在不使用宏的情况下简化这些代码?

class MyException1: public std::exception
{
public:
    explicit MyException1(const char *text = "") : std::exception(text) {}
};

class MyException2: public std::exception
{
public:
    explicit MyException2(const char *text = "") : std::exception(text) {}
};

class MyException3: public std::exception
{
public:
    explicit MyException3(const char *text = "") : std::exception(text) {}
};

//...

3 个答案:

答案 0 :(得分:7)

当一切都公开时,无需使用class。您可以改用struct。此外,您可以继承构造函数:

struct MyException1: std::exception
{
    using std::exception::exception;
};

struct MyException2: std::exception
{
    using std::exception::exception;
};

struct MyException3: std::exception
{
    using std::exception::exception;
};

另外,如果你真的需要不同的类型,你可以这样做:

template <int>
struct MyException : std::exception
{
    using std::exception::exception;
};


using MyException1 = MyException<1>;
using MyException2 = MyException<2>;
using MyException3 = MyException<3>;

如果您想要更具描述性的名称,可以使用enum代替int

答案 1 :(得分:0)

你可以是using超类'构造函数。以下简化的代码示例可以满足您的需求:

#include <iostream>

class A {
public:
  A(char* cText) {
    std::cout << cText << std::endl;
  }

  ~A() {
  }
};

class B : public A {
public:
  using A::A;

  ~B() {
  }
};

int main(int argc, char** argv) {
  B("Test");

  return 0;
}

此外,继承构造函数的using功能仅在使用-std=c++11-std=gnu++11进行编译时可用。

答案 2 :(得分:0)

以下在我的VisualStudio 2012中编译良好:

> > "C:\Program Files\Java\jdk1.7.0_80\bin\java" -Xmx1024M -XX:MaxPermSize=512m -Dmaven.home=C:\IBM\apache-maven-3.3.3 -Dclassworlds.conf=C:\IBM\apache-maven-3.3.3\bin\m2.conf -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0.2\bin" -Dfile.encoding=UTF-8
> -classpath "C:\apache-maven-3.3.3\boot\plexus-classworlds-2.5.2.jar;C:\Program
> Files (x86)\JetBrains\IntelliJ IDEA 14.0.2\lib\idea_rt.jar"
> com.intellij.rt.execution.application.AppMain
> org.codehaus.classworlds.Launcher -Didea.version=14.0.2
> -DskipTests=true package -P enterprise
> 
> -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.

不幸的是,C ++不允许在throw语句本身中使用字符串文字。详情请见:String literals not allowed as non type template parameters