Есть ли лучший способ создания пользовательских сообщений об ошибках для идеальной пересылки на конструкторы?

У меня есть следующий код C++ для проверки нашей идеальной пересылки, используемой при делегировании аргументов конструкторам для объектов разных типов:

#include <iostream>

// THIS CLASS TAKES 2 ARGUMENTS.
struct A {
    A(int i, int j) {
        i = i;
        j = j;
    }

    int i;
    int j;
};

// THIS CLASS TAKES 3 ARGUMENTS.
struct B {
    B(int i, int j, int k) {
        i = i;
        j = j;
        k = k;
    }

    int i;
    int j;
    int k;
};

// THIS CLASS IS A VARIANT-LIKE DELEGATOR
// WHOSE FIRST ARGUMENT IS THE TYPE TAG,
// AND THE REST ARE FORWARDED TO THE CORRESPONDING CLASS.
struct Delegator {
    enum class Type : int {
        CLASS_A,
        CLASS_B
    };

    union {
        A a;
        B b;
    };

    template <typename... Args>
    Delegator(Delegator::Type type, Args... args) {
        type_ = type;

        if (type_ == Delegator::Type::CLASS_A) {
            new (&a) A(std::forward(args...));
        } else if (type_ == Delegator::Type::CLASS_B) {
            new (&b) B(std::forward(args...));
        } else {
            throw std::invalid_argument("Delegator constructor: "
            "forwarded arguments does not match any of its member type constructors!");
        }
    }


private:
    Delegator::Type     type_;
};

int main() {
    // THIS IS GOOD.
    Delegator delegator(Delegator::Type::CLASS_A, 1, 2);

    // THIS IS BAD.
    Delegator delegator(Delegator::Type::CLASS_A, 1, 2, 3, 4);
}

Мне было интересно - каково текущее состояние сообщений об ошибках в C++ при работе с этими типами случаев? Есть что-нибудь сопоставимое с (syntax-error) средство, предоставленное Схемой, чтобы пользователи объекта могли получить лучшее сообщение об ошибке при неправильном использовании? Мне все равно, какой стандарт C++ используется - я просто хочу знать, возможно ли в настоящее время подправить диагностические сообщения об ошибках C++.

Может ли программист сделать что-нибудь с этими сообщениями об ошибках с длинным шаблоном для будущих пользователей? Или все это в руках компилятора?

0 ответов

Другие вопросы по тегам