Próbuję zrozumieć poniższy przykład, który jest podobny (ale nie identyczne) do jednego zaksięgowane wcześniej na tak Help understanding boost::bind placeholder arguments:Boost.Bind - zrozumienie zastępcze
#include <boost/bind.hpp>
#include <functional>
struct X {
int value;
};
int main() {
X a = { 1 };
X b = { 2 };
boost::bind(std::less<int>(),
boost::bind(&X::value, _1),
boost::bind(&X::value, _2))
(a, b);
}
Jak to możliwe, że najbardziej zewnętrzna funkcja wiązania wie, że musi przekazać pierwszy argument drugiemu wiązaniu (które oczekuje _1
), a drugi argument trzeciemu wiązaniu (które oczekuje _2
)? Sposób, w jaki to widzę, polega na tym, że wewnętrzne środki wiążące są najpierw oceniane, więc stają się dwoma jednojajowymi obiektami funkcjonalnymi, które następnie przekazuje się do obiektu wiążącego obiektu less<int>
. A gdy nowo utworzony obiekt funkcjonalny jest wywoływany dwoma obiektami, a
przechodzi do pierwszego wewnętrznego wiązania, a b
przechodzi do drugiego. Gdybym miał rację, dwukrotnie skorzystalibyśmy z _1
. Muszę się mylić. Powtórzę raz jeszcze moje pytanie, aby wyjaśnić mój problem: w jaki sposób zewnętrzny segregator wie, który symbol zastępczy został użyty w którym wewnętrznym segregatorze?
ok, rozumiem. Ale co się stanie, jeśli jeden z powiązanych argumentów nie jest segregatorem, np. wartość kosztu? Mam na myśli: boost :: bind (std :: less(), boost :: bind (& X :: value, _1), 10) (a); Skąd wiadomo, do którego argumentu powinna przypisać wygenerowaną krotkę? –
@Mar Zaktualizowałem moją odpowiedź, nie krępuj się – Anycorn