Я хочу написать простую структуру ошибок, которая содержит некоторый код ошибки и std::string
в качестве сообщения.Код ошибки может быть простым int или любым типом строго типизированного перечисления, например:
enum class NetworkErrorCode {
OK = 0,
CONNECTION_FAILURE,
EMPTY_RESPONSE,
HOST_RESOLUTION_FAILURE,
UNKNOWN_ERROR = 1000,
};
Я мог бы написать структуру, которая имеет разные перегруженные конструкторы для каждого отдельного перечисления, которые могут содержать, которые все преобразуют их в int
для их хранения.Но в этом случае я бы упустил возможность сравнить код ошибки с фактическими значениями перечисления позже.Мне также нужно написать оператор сравнения для каждого из возможных типов.
Я также мог бы использовать шаблоны, подобные этому:
template<typename T>
struct Error
{
T const code;
std::string const message;
};
Но теперь я не смог бы создать ошибку, подобную этой:
Error{NetworkErrorCode::CONNECTION_FAILURE, "some message"}
.
Мне нужно написать:
Error<NetworkErrorCode>{NetworkErrorCode::CONNECTION_FAILURE, "some message"}
.
Есть ли способ избежать написания большого количества кода, как в первом решении, сохраняя при этомвозможность их создания без явного указания имени типа?Я слышал о выводе аргументов шаблона для конструкторов шаблонов классов в c ++ 17, но я не могу разобраться с этим.