sar*_*had 2 c++ templates derived-class
我需要从基类创建许多类(超过50个),其中唯一的区别在于派生类的名称.
例如,我的基类定义为:
class BaseError : public std::exception
{
private:
int osErrorCode;
const std::string errorMsg;
public:
int ec;
BaseError () : std::exception(), errorMsg() {}
BaseError (int errorCode, int osErrCode, const std::string& msg)
: std::exception(), errorMsg(msg)
{
ec = errorCode;
osErrorCode = osErrCode;
}
BaseError (const BaseError& other)
: std::exception(other), errorMsg(other.errorMsg)
{
ec = other.errorCode;
osErrorCode = other.osErrorCode;
}
const std::string& errorMessage() const { return errorMsg; }
virtual ~BaseError() throw(){}
}
Run Code Online (Sandbox Code Playgroud)
我必须从这个基类创建许多派生类,每个类都有自己的构造函数,复制构造函数和虚拟析构函数,目前我正在复制/粘贴代码,在必要时更改名称:
class FileError : public BaseError{
private:
const std::string error_msg;
public:
FileError () :BaseError(), error_msg() {}
FileError (int errorCode, int osErrorCode, const std::string& errorMessage)
:BaseError(errorCode, osErrorCode, errorMessage){}
virtual ~FileError() throw(){}
};
Run Code Online (Sandbox Code Playgroud)
问题:是否有某种方法可以使用模板创建这些类,因此不会重复实现?
我想您要创建一个类层次结构,以便您可以在catch子句中使用动态分派(依赖于编译器找出正确的类型)来实现自定义错误处理.您可以通过保持BaseError类原样,然后添加一个模板类来为此提供多个实例化.考虑一下:
class BaseError : public std::exception
{
private:
int osErrorCode;
const std::string errorMsg;
public:
int ec;
BaseError () : std::exception(), errorMsg() {}
BaseError (int errorCode, int osErrCode, const std::string& msg)
: std::exception(), errorMsg(msg)
{
ec = errorCode;
osErrorCode = osErrCode;
}
// ...
};
template <int T>
class ConcreteError : public BaseError {
public:
ConcreteError () :BaseError(), error_msg() {}
ConcreteError (int errorCode, int osErrorCode, const std::string& errorMessage)
:BaseError(errorCode, osErrorCode, errorMessage){}
};
Run Code Online (Sandbox Code Playgroud)
您现在可以设置一些类型定义:
typedef ConcreteError<0> FileError;
typedef ConcreteError<1> NetworkError;
typedef ConcreteError<2> DatabaseError;
// ...
Run Code Online (Sandbox Code Playgroud)
您现在拥有一个包含三个不同错误类的层次结构.