2017-09-08 23 views
7

Bu örnek, (https://ideone.com/RpFRTZ)mem_fun + bind2nd

Bu etkili ilişkisiz bir tip Bar bir parametreye sahiptir ve Foo::comp (const Foo& a) arayacak dikkate rasgele bir tipte bir bağımsız değişken ile bir yöntem açmasına olanak sağlar. Ben std::cout << "a = " << a.s << std::endl; dışarı yorum yaparsanız bu derleme, aynı zamanda her nasılsa çalışıyor kalmıyor ve baskılar

Ben Ama ... yeterince adil olan, çalışma sırasında parçalama arızası daha değer yazdırmak yoksa Result: 0 neden ilk derliyor yerleştirin?

#include <functional> 
#include <string> 
#include <iostream> 

struct Foo 
{ 
    bool comp(const Foo& a) 
    { 
     std::cout << "a = " << a.s << std::endl; 
     return a.s == s; 
    } 

    std::string s; 

}; 

struct Bar 
{ 
    int a; 
}; 


template <class F, class T> 
void execute (F f, T a) 
{ 
    std::cout << "Result: " << f (a) << std::endl; 

} 

int main() 
{ 
    Foo* f1 = new Foo; 
    f1->s = "Hello"; 

    Foo f2; 
    f2.s = "Bla"; 

    Bar b; 
    b.a = 100; 

    execute (std::bind2nd (std::mem_fun(&Foo::comp), b), f1); 


    return 0; 
} 
+1

Lütfen, 'std :: mem_fun' ve 'std :: bind2nd' öğelerinin C++ 11'de kullanımdan kaldırıldığını ve C + 17'de kaldırıldığını unutmayın. –

+0

Ayrıca, değiştirilen işlevleri kullanarak, beklenen sonucu (https://ideone.com/9lFJat) ve daha "yararlı" hata iletisini alırsınız. –

+0

@Bob__, evet Bunu biliyorum. Bu hatayı, henüz C++ 11'e geçirilemeyen eski bir kodda bulduk – cppalex

cevap

1

cevap std :: bind2nd uygulanmasında geçerli: böylece

template<typename _Operation, typename _Tp> 
    inline binder2nd<_Operation> 
    bind2nd(const _Operation& __fn, const _Tp& __x) 
    { 
     typedef typename _Operation::second_argument_type _Arg2_type; 
     return binder2nd<_Operation>(__fn, _Arg2_type(__x)); 
    } 

Doğru türüne güvenli olmayan bir C tarzı dökme "_Arg2_type (x __)" olduğunu görebilirsiniz, örneğiniz şu şekilde yazılmıştır:

execute (std::bind2nd (std::mem_fun(&Foo::comp), (const Foo&)b), f1); 

, ne yazık ki geçerli C++ kodu.