Принцип вызова разных функций, но с одинаковыми параметрами

146
19 августа 2018, 05:50

Делема состоит из следующего, к примеру существует 2 функции си кода, которые в свою очередь принимают одинаковые параметры, но выполняют разные действия, в моем случае локальный, и удаленный файл.

// Выполняет открытие файла локально.
my_data* new_path(my_super_struct* data, const char* path);
// Может работать по любому доступному протоколу, `file://some_path`
// не исключение.
my_data* new_location(my_super_struct* data, const char* mrl);

При передачи данных в класс, передается булевое значение откуда открывается файл, и вот тут-то и происходит проблема, что лучше использовать, адрес на функции, или if/else?

Т.е. я могу сделать вызов функций одинаково что по адресу, что через if/else:

void some_void(const char* file_path, bool is_local)
{
    // Первый вариант
    my_super_data = (*(is_local ? &new_path : &new_location))(some_data, path);
    // if/else не нуждается в комментировании, думаю.
}

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

Answer 1

Лучше это будет с constexpr if. сюда Но при условии, что is_local будет известен на этапе компиляции. Таким образом избавитесь от лишних проверок в рантайме. А если выбирать из двух - то лучше if/else и вызывать нужную. Так как присвоение указателю новой ссылки на функцию - это лишняя операция, и как это оптимизирует компилятор - знает только конкретный компилятор.

my_super_data = (*(is_local ? &new_path : &new_location))(some_data, path);

Имя функции - уже ссылка на функцию, амперсанд будет лишним и бессмысленным.

READ ALSO
Где применить абстрактный класс и его свойства?

Где применить абстрактный класс и его свойства?

Создаю приложение в Qt для работы с базой данныхПо заданию необходимо использованием абстрактных классов

188
Не отображается код [закрыт]

Не отображается код [закрыт]

Во время отладки во второй части кода, visual начал серьезно тормозить, а программа повела себя не так как ожидалосьЯ прервал выполнение, но код...

185
Функция strtod() считывает только целую часть вещественного числа

Функция strtod() считывает только целую часть вещественного числа

Использую inih для парсинга ini файлаОбнаружилось то, что функция INIReader::GetReal(

167
Невозможно открыть вторую форму в Qt

Невозможно открыть вторую форму в Qt

При переходе на другую форму в Qt у меня возникает ошибка:

155