[英]Avoid c++ compiler name resolution for exception class aliases
我的代碼庫中定義了幾個自定義異常類。 這些通常從一個基本異常類型繼承,該異常類型本身從 std::runtime_error 繼承。 這樣的異常通常不需要實現特定的行為,我只想要每個特定異常的顯式類型名稱。
類定義通常如下所示:
class ExceptionA : public Base
{
public:
using Base::Base;
};
class ExceptionB : public Base
{
public:
using Base::Base;
};
基類如下所示:
class Base : std::runtime_error {
public:
Base(std::string msg)
: runtime_error(msg)
{}
};
現在,我討厭代碼重復來定義一個與 Base 沒有區別的簡單類型,所以我想將我的代碼重構為 DRYer。 我的第一次嘗試是通過類模板:
template<class B>
class Exception : public B
{
public:
using B::B;
};
然后我嘗試使用別名:
using ExceptionA = Exception<Base>;
或者
typedef Exception<Base> A;
但在這兩種情況下,當我有一個未捕獲的異常時,編譯器將類型名稱解析為模板實例:
terminate called after throwing an instance of 'Exception<Base>'
如何通過模板實例化來真正定義一種新類型? 是否有更好的解決方案可以避免每次都重新定義新類型。 我想用消息字符串維護 runtime_error 非平凡構造函數。
這里的最終目標是使代碼干燥,因此,如果解決方案更優雅,我會接受與我的完全不同的解決方案。
您可以添加標簽,例如:
template <typename Tag>
class Base : std::runtime_error {
public:
explicit Base(std::string msg) : runtime_error(msg) {}
};
using ExceptionA = Base<struct TagA>;
using ExceptionB = Base<struct TagB>;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.