2013-03-10 14 views

Odpowiedz

14

Bo tak robi boost::bind, a autor Boost.Bind napisał propozycję dodania go do TR1 i skopiował go do standardu.

Jeśli chodzi o to, dlaczego Boost.Bind robi to w ten sposób, nie wiem, ale zaryzykowałbym przypuszczenie, że może to być dopasowanie std::bind1st i std::bind2nd ze standardu 1998, który pochodzi od STL. W tym kontekście „1”, to znaczy „pierwszy” jest poprawny (nawet w systemie indeksowania od zera element o indeksie zerowym jest pierwszy, nie zerowego, poz.)

więc może zastępcze powinny być _1st, _2nd, _3rd, _4th itd. ale nie dla Anglików, którzy nie znają niespójne przyrostków na ordinal numbers to chyba łatwiejsze do zapamiętania _1, _2 itp

tylko dzikie przypuszczenie chociaż. Pytanie nigdy mi się nie przydarzyło, więc teraz jestem też ciekawy :-)

6

Konwencja prawdopodobnie została przeniesiona z poprzedniej wersji Boost.bind.

Co do tego, dlaczego biblioteka Boost wybrała zaczynając od 1: segregatory, które były częścią C++ 03, użyły first_argument i second_argument jako nazwy typów.

Biblioteka standardowa C++ miała bind1st() i bind2nd(), więc naturalnym uogólnieniem funkcji n-ary było "bind 3rd", "bind 4th", i tak dalej.

Żadne z nich nie jest prawdziwym powodem, ale oferuje prawdopodobne wyjaśnienie.

+1

Nie kupiłbym "nigdy nie słyszałem, żeby ktoś mówił o argumentach 0st", ponieważ zwykle nie mówisz nawet o elemencie 0st tablicy. Mówisz "1st", ale jego indeks wynosi 0. Jednak historyczny argument ma sens.Biblioteka Standard miała "bind1st()" i "bind2nd()", więc naturalnym uogólnieniem funkcji "n" było "bind 3rd", "bind 4th" i tak dalej. –

+1

Nigdy nie słyszałem "zero-st", ale ja "nie słyszałem" zero-th "... to nie czyni go poprawnym angielskim jednak :) –

+0

@AndyProwl tak, to nie jest naprawdę przekonujące. Czy możesz to edytować? Jestem na komórce i to jest ból. – pmr

-1

Projektanci biblioteki wiązania boost byli fanami składni wsadowej MSDOS.

W składni wsadowym %1 odnosi się do pierwszego argumentu, %2 drugim, %3 trzecim itd Ale ponieważ % nie jest poprawnym identyfikatorem C++, ale zastąpił go _.

W składni wsadowej MSDOS %0 odnosi się do nazwy pliku wsadowego. W takim przypadku _0 będzie związany z funkcją, którą wywołasz pod numerem _1,, _3 itd.

Właściwie nie, nie bardzo.

+0

Wycofany, ponieważ zgaduję, że wielu ludzi nigdy nie dotarło do ostatniej linii twojej odpowiedzi ... Tak naprawdę myślałem coś podobnego, ale poważnego, jeśli chodzi o powłoki POSIX ('$ 0',' $ 1', itp.) –

3

Zaletą tego jest działanie std::is_placeholder. Wynik nie jest po prostu prawdziwy lub fałszywy, jest wartością samego zastępczego.

std::is_placeholder<_1>::value == 1 
std::is_placeholder<_2>::value == 2 
std::is_placeholder<_7>::value == 7 

ale nic nie zastępczy oceni do 0 (co jest oczywiście fałszywe). Jeśli symbole zastępcze zaczynały się od _0, to nie działałoby.

+0

Podczas gdy jest prawdą, można go łatwo uruchomić, nadając "_0" wartość 1 i "_1" wartość 2 itd., więc nie-zmienne mają wartość 0. –