У меня функция принимает два «необязательных» параметра, но логика функции предполагает, что будет указан хотя бы один. Если предоставляется a, то используется a. Если предоставляется b, то используется b. Если ни один из параметров не указан, генерируется исключение, потому что для успешной работы этой функции требуется хотя бы один из параметров. См. Пример во фрагменте кода:

void print_it(A* a = nullptr, B* b = nullptr)
{
    std::cout << "The parameter provided was ";
    if (a != nullptr)
    {
        std::cout << a->print();
    }
    else if (b != nullptr)
    {
        std::cout << b->print();
    }
    else
    {
        throw std::invalid_argument();
    }
}

Я бы сказал, что это плохая практика - иметь такую ​​функцию, которая дает сбой во время выполнения, когда вызывается ее форма по умолчанию, вместо использования безопасности типов и проверки компилятором на наличие ошибок.

Как изменить сигнатуру этой функции на требовать , чтобы одно из значений предоставлялось с минимальным дублированием кода?

0
Grant Schulte 21 Май 2021 в 00:02

1 ответ

Лучший ответ

Вы можете перегрузить это так:

void print_it(A a, B b)
{
//use a and b
}

void print_it(A a) {
//use a
}
void print_it(B b) {
//use b
}

Или вы можете использовать std::optional, как описано здесь: https: // en. cppreference.com/w/cpp/utility/optional. Пример:

void print_it(std::optional<A> a, std::optional<B> b)
{
    if (a.has_value()) {
        //use a
    }
    if (b.has_value()){
        //use b
    }
    else {
        throw std::invalid_argument();
    }
}
4
Eduardo Maroto Campos 20 Май 2021 в 21:20