簡體   English   中英

避免異常類別名的 C++ 編譯器名稱解析

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM