Многократное сообщение об ошибке проверки при использовании шаблона, maxlength и required. Я хочу показать только одну пользовательскую ошибку, а не три разные ошибки

Своеобразное ограничение, что должен быть только один конструктор. Вот самое близкое, о котором я могу думать:

#include <iostream>

// cheap and cheerful Boost.Variant
struct StringOrInt {
    char *s;
    int i;
    bool is_string;
    StringOrInt(char *s) : s(s), i(0), is_string(true) {}
    StringOrInt(int i) : s(0), i(i), is_string(false) {}
    bool isInt() { return !is_string; }
    int asInt() { return i; }
    char *asString() { return s; }
};

struct Foo {
    int m1;
    char *m2;
    int m3;
    Foo(int arg1, StringOrInt arg2 = "arg2", int arg3 = 1) : m1(arg1) {
        if (arg2.isInt()) {
            arg3 = arg2.asInt();
            arg2 = "arg2";
        }
        m2 = arg2.asString();
        m3 = arg3;
    }
    void print() {
        std::cout << m1 << " " << m2 << " " << m3 << "\n";
    }
};

int main() {
    Foo(1, "HelloWorld").print();
    Foo(1, 2).print();
}

Обратите внимание, что с GCC это генерирует предупреждения, поскольку преобразование из строкового литерала в неконстантный char* является устаревшим и неразумным. Но это то, о чем вы просили, и исправление его, чтобы параметры char* и элемент данных были const char* достаточно легкими.

Существенная слабость заключается в том, что это не мешает вам писать Foo(1,2,3) , Чтобы проверить, что во время компиляции мне нужно несколько конструкторов. Чтобы проверить его во время выполнения, вы можете сделать третий параметр в другом классе, DefaultOrInt, где Default - это тип, используемый только для этой цели, поддерживающий только одно значение, используемое как значение по умолчанию для arg3. Тогда, если arg2.isInt() истинно, проверьте, что arg3.isInt() является ложным и если не выбрасывает logic_error.

1
задан praveen marandi 18 March 2019 в 12:37
поделиться