2016-07-31 29 views
3

要創建的std ::功能,這裏是我做的: -省略的std ::性病佔位符::綁定

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 

很明顯,B::fb接受三個參數。
爲了增加可讀性& maintainablity,我希望我能代替稱之爲: -

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

問題
是否有C++的任何功能,能夠省略佔位符?
它應該自動調用_1,_2,...的順序。

我已經使用了「省略佔位符C++」但沒有找到任何線索。

+4

不能省略的佔位符。請記住'B :: fb'可能會超載。 – KayEss

+0

然後,讓它把「模糊」的編譯錯誤給我。 – javaLover

+0

那麼,如果你忽略了節奏,它現在確實會報錯。不是一個「ambiguius」,但足夠接近。 –

回答

7

您可以創建功能幫手(那些部分是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)...); }; 
} 

,然後就寫

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

酷!有用。 – javaLover