LINUX.ORG.RU

Необязательный параметр функции, из qml в c++

 ,


0

1

Как объявить и передавать в функциюю необязательный параметр типа int, так чтобы потом в теле функции можно было проверить был он передан или нет? Единственно что приходит в голову это добавить еще один булевый параметр, который это будет показывать. Можно как-то иначе?

Чем в данном случае отличается QML от не QML?

Вариантов не особо много, я бы сделал значение по-умолчанию, которое при нормальной работе передано не будет, например -1 или там -42042.

Но вообще похоже на костыли :/

CrossFire ★★★★★
()

Можно как-то иначе?

Можно использовать какой-то из вариантов optional. Либо boost::optional, либо std::optional из грядущего C++17, либо одну из каких-то других реализаций. Тогда будет что-то вроде:

void f(int mandatory_arg, optional<int> opt_arg = optional<int>{}) {
  ...
  if(opt_arg) ...
}

Либо же можно использовать указатель на int.

void f(int mandatory_arg, int * opt_arg = nullptr) {
  ...
  if(opt_arg) ...
}
Но в этом случае придется делать что-то вроде:
int v = 42;
f(0, &v);

eao197 ★★★★★
()
Ответ на: комментарий от eao197

вот с указателем не понятно как сделать через qml

user0228
() автор топика
Ответ на: комментарий от user0228

тем что хотел оставить одну реализацию функции

Q_INVOKABLE void foo(int a) { fooImp(a); }
Q_INVOKABLE void foo(int a, int b) { fooImp(a, b); }

void fooImp(int a, std::optional<int> b = std::optional<int>{}) {
  // Implementation
}

И не нужно никаких танцев с бубном в QML.

cyanide_regime
()

Легко.

Q_INVOKABLE void foo(int a, QJSValue b = QJSValue::UndefinedValue) {
    qDebug() << "a is" << a;
    if (!b.isUndefined()) {
        qDebug() << "b is" << b.toInt();
    } else {
        qDebug() << "b is undefined";
}

fluorite ★★★★★
()
Последнее исправление: fluorite (всего исправлений: 1)
Ответ на: комментарий от fluorite

Зачем стрелять из пушки по воробьям, если можно обычный optional использовать? Во-вторых, так теряется типобезопасность.

Deleted
()
Ответ на: комментарий от Deleted

И давно в QML optional завезли? Во-вторых, типобезопасность нифига не обеспечивается, т.к. из qml прекрасно вызывается foo(«42»), хотя там ожидается int, например.

fluorite ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.