В основном то, что я хочу сделать, это:
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
Вы можете отложить вызов функции с помощью 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, ….
…
Других решений пока нет …