2016-07-31 23 views
3

std :: Funktion zu erstellen, hier ist das, was ich tue: -auslassen std :: Platzhalter in std :: bind

std::function<void(int,int,int)> f= 
    std::bind(&B::fb,this, 
     std::placeholders::_1, 
     std::placeholders::_2, 
     std::placeholders::_3 
    ); 

void B::fb(int x,int k,int j){} //example 

Es ist offensichtlich, dass B::fb drei Parameter erhalten.
Um die Lesbarkeit & maintainablity zu erhöhen, ich wünsche ich diese stattdessen nennen könnte: -

std::function<void(int,int,int)> f=std::bind(&B::fb,this); //omit _1 _2 _3 

Frage
Gibt es irgendwelche Funktionen in C++, die die Platzhalter Weglassen aktivieren?
Es sollte _1, _2, ..., in Bestellungen automatisch aufrufen.

Ich habe gegoogled "Platzhalter C++ weglassen", aber keine Spur finden.

+4

Sie können nicht die Platzhalter weglassen. Denken Sie daran, dass 'B :: fb' möglicherweise überlastet ist. – KayEss

+0

Dann, lassen Sie es den "mehrdeutigen" Kompilierungsfehler zu mir werfen. – javaLover

+0

Nun, es wirft jetzt einen Fehler, wenn Sie Pace Holders weglassen. Kein "Ambiguismus", aber nahe genug. –

Antwort

7

Sie können Funktionen Helfer erstellen (die diejenigen sind C++ 14):

template <class C, typename Ret, typename ... Ts> 
std::function<Ret(Ts...)> bind_this(C* c, Ret (C::*m)(Ts...)) 
{ 
    return [=](auto&&... args) { return (c->*m)(std::forward<decltype(args)>(args)...); }; 
} 

template <class C, typename Ret, typename ... Ts> 
std::function<Ret(Ts...)> bind_this(const C* c, Ret (C::*m)(Ts...) const) 
{ 
    return [=](auto&&... args) { return (c->*m)(std::forward<decltype(args)>(args)...); }; 
} 

und dann schreiben Sie einfach

std::function<void(int, int, int)> f = bind_this(this, &B::fb); 
+0

Cool! Es klappt. – javaLover