Вызов функции с целочисленным макросом [[mayb_unused]] и параметром логического типа аргумента по умолчанию

Я пишу функцию с двумя параметрами, 1-й — это целочисленный тип, отмеченный [[maybe_unused]], а 2-й — логический тип с аргументом по умолчанию false.

int preOrderTraversial([[maybe_unused]] int searchData, bool forDisplay = false)

Это объявление функции. Функция используется для обхода предварительного заказа в двоичном дереве поиска. Я хочу использовать одну и ту же функцию для отображения дерева и его обхода для поиска узла с определенными данными. Но только для 1-го обе проблемы сразу. Не для поиска И отображения вы видите.

Так что, очевидно, это отлично работает для части поиска, но когда я вызываю функцию для отображения, вызов функции выглядит следующим образом:

preOrderTraversal(true)

or

bool forDisplay = true;
preOrderTraversal(forDisplay);

Теперь компилятор (даже с параметром, ОБЪЯВЛЕННЫМ как BOOL) по-прежнему рассматривает этот параметр bool как int и использует его для параметра searchData (integer) функции, а не для параметра forDisplay (bool).

Есть ли способ заставить или сообщить компилятору, с каким из обоих параметров я пытаюсь работать?


person Haider Sultan    schedule 20.03.2021    source источник


Ответы (1)


[[maybe_unused]] означает, что тело функции может не использовать его, но оно всегда есть в сигнатуре функции. Фактически, значение по умолчанию для логического значения не изменяет сигнатуру вашей функции; Таким образом, ваша функция всегда принимает 2 аргумента, первый из которых является целым числом, а второй — логическим (может быть установлено значение по умолчанию, если вы его не указали). Вы заканчиваете тем, что звоните:

bool forDisplay = true;
preOrderTraversal(/* integer searchData; bool geting casted to int */ forDisplay,
                  false /* the forDisplay (2nd param) default value*/);

что не соответствует вашим ожиданиям.

[EDIT] как побороть? В С++ нет встроенного способа использования именованных параметров, но вы можете обойти это, используя вспомогательный класс:

struct PreOrderTraversal {
  bool _forDisplay = false;
  int _searchData = 0; /* FIXME What is the default here? */
  auto& forDisplay() { _forDisplay = true; return *this; }
  auto& searchData(int x) { _searchData = x; return *this; }

  void run() { if (_forDisplay) ;//do the right things
               else ;// use data

  }
};

то вы можете использовать его с:

PreOrderTraversal().forDisplay().run();
PreOrderTraversal().searchData(123).run();

Это своего рода имитирует функцию именованного параметра.

person OznOg    schedule 20.03.2021
comment
Именно это я и пытаюсь преодолеть. Есть ли способ обойти эту проблему? - person Haider Sultan; 20.03.2021
comment
Ага! Я могу полностью использовать это ????????. Просто хотел сделать это не так, как другие, просто как вызов, но потом я застрял, лол. Спасибо за помощь - person Haider Sultan; 20.03.2021