Отложенный вызов функции в отложенном вызове функции

В основном то, что я хочу сделать, это:

std::function< int( void ) > foo = &getInt;
int magicNumber = 13;
std::function< int( void ) > delayedAdd = std::bind( std::plus, magicNumber, getInt );

Очевидно, это не сработает. Мне нужно как-то обернуть getInt вызов так что это происходит прямо перед std::plus функция происходит. Тогда все, что нужно будет отложить до звонка delayedAdd,

Я работаю с Qt5.0 вне QObject, поэтому я не могу connect лямбда в SLOT, Но я хочу connect что-то вроде delayedAdd к SLOT вместо.

+тег funception

2

Решение

Вы можете отложить вызов функции с помощью std::bind:

using namespace std;

int getInt() {
cout << "getInt!" << endl;
return 42;
}

function<int(void)> foo = &getInt;
int magicNumber = 13;

cout << "before delayed definition" << endl;
function<int(void)> delayed = std::bind(plus<int>(), magicNumber, bind(foo));
cout << "after delayed definition" << endl;

int i = delayed();

cout << "after delayed call" << endl;

Выход:

до отсроченного определения
после отсроченного определения
GetInt!
после отложенного звонка

Вам не нужно определять foo как и вы. Вы можете просто связать getInt непосредственно в определении delayed:

function<int(void)> delayed = bind(plus<int>(), magicNumber, bind(getInt));

Для более подробной информации о std :: bind, проверьте N3797, пункт 20.9.9.
Для более конкретного объяснения, cppreference говорит:

возвращаемый тип std :: bind

Оператор функции-члена ()
Учитывая объект g, полученный из более раннего вызова связывания, когда он вызывается в выражении вызова функции g (u1, u2, … uM), происходит вызов хранимого объекта типа std :: decay :: type с аргументами, определенными следующим образом:

— Если std :: is_bind_expression :: value == true (то есть другое подвыражение bind было использовано в качестве аргумента при первоначальном вызове bind), то это подвыражение bind вызывается немедленно, а его результат передается объекту, подлежащему вызову. Если подвыражение bind имеет аргументы-заполнители, они выбираются из u1, u2, ….

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]