2013-03-21 14 views
5

basit bir örneğidir. f2(x,y) = f3(x,5,y) olarak tanımlanan 2 bağımsız değişkenin bir fonksiyonuna sahip olmak istiyoruz. C++ biz std::bind ile bunu kolayca yapabilirsiniz:std :: bind nasıl kullanılabilir? f3 (x, y, z):</p> <p>bir 3 bağımsız değişken fonksiyonuna sahip olduğunu varsayalım: aşağıdaki gibi kullanılabilir nasıl <code>std::bind</code> açıklar

auto f2 = std::bind(f3, _1, 5, _2); 

Bu örnek bana açık: std::bind ilk argüman olarak bir işlev alır ve n fonksiyonunun argümanları sayısıdır o zaman alır n diğer argümanlar Bu std::bind için ilk argüman olarak alınır.

void foo(int &x) 
{ 
    ++x; 
} 


int main() 
{ 
    int i = 0; 

    // Binds a copy of i 
    std::bind(foo, i)(); // <------ This is the line that I do not understand. 
    std::cout << i << std::endl; 

} 

O foo bir argüman olduğu açıktır ve std::bind ile bu i olarak ayarlandı:

Ancak, bağlama başka bir kullanım bulmuştur. Ama neden (foo, i)'dan sonra başka bir çift parantez kullanıyoruz? Ve neden std::bind'un çıkışını kullanmıyoruz? Demek istediğim, neden auto f = std::bind(foo, i)'umuz yok?

bir bağ functor oluşturur
auto bar = std::bind(foo, i); 
bar(); 

, daha sonra hemen (parantez ikinci çifti kullanılarak) çağırır:

+2

Ne yeryüzünde 'olduğunu \\\'? –

+0

Bir açıklama olması gerekiyordu: // – Roman

cevap

8

hattı

std::bind(foo, i)(); 

eşdeğerdir.

Düzenleme: doğruluk adına iki fonksiyonu doğrudan çağırmak aslında eşdeğer değildir (ve @Roman, @daramarak tarafından işaret): i std için :: bağlama değeri tarafından geçirilir. i ile doğrudan foo çağrılmasına kod eşdeğer, şöyle olacaktır:

auto bar = std::bind(foo, std::ref(i)); 
bar(); 
+0

geçersiz itiraz hakkında yorumlarımı kaldırıldı – daramarak

2

Sizin iki soru hemen hemen birbirlerine cevap. Takip eden () sadece normal bir işlev çağrısıdır. Bu nedenle, ifade şu anlama gelir: "i'u foo'a bağla; bu, hiçbir parametre almayan bir işlev kazandıracak, ardından sonuç işlevini çağıracaktır." Kodun yazarı, çağrıldıktan sonra işleve artık gerek duyulmadığından, herhangi bir yerde saklanmaz.

3

Bu geçici nesneye foo bağlayan ve daha sonra hemen diyoruz:

auto f = std::bind(foo, i); 
    f(); 

Tek hat sürümü: hat

std::bind(foo, i)() ; 

yana

std::bind(foo, i)(); 
0

... yapar aynı şey ...

foo(i); 

... bu gerçekten gerçek kodda karşılaşabileceğiniz std :: bind öğesinin bir 'kullanımı' değildir, ancak diğerlerinde açıklandığı gibi std :: bind'in ne yaptığını basit bir örnek olarak sunar. cevapları.

Bulunduğunuz gibi, bağlamanın sonucunu saklamak ve başka bir yere çağırmak olağan durumdur, aksi halde ilk olarak std :: bind ile kodun karmaşıklaştırılmasında bir nokta yoktur.

İlgili konular