2013-08-03 104 views
0

如何才能boost::bind()模板函數?boost :: bind()帶模板函數

我想要這段代碼(受boost::bindbind_as_compose.cpp例子的啓發)編譯和運行。請注意,評估與bind_as_compose.cpp示例中的不同。 fff()開始運行kkk()

template<class F> 
void fff(F fun) 
{ 
    std::cout << "fff("; 
    fun(); 
    std::cout << ")"; 
} 

void kkk() 
{ 
    std::cout << "kkk()"; 
} 

void test() 
{ 
    fff(kkk);    // "Regular" call - OK 
    // bind(fff,kkk)(); // Call via bind: Does not compile!!! 
} 

要打印:

fff(kkk()) 
fff(kkk()) 

更新: 基於this answer,我得到這個工作:

​​

然而,這要求我明確指定th Ë實例類型,哪種擊敗目的...

更新2 最後,我想綁定的對象傳遞作爲一個無參調用類型的參數一樣fff()其他功能。在這種情況下,什麼是顯式類型?

說我有另一個模板函數ggg()

template<class F> 
void ggg(F fun) 
{ 
    std::cout << "ggg("; 
    fun(); 
    std::cout << ")"; 
} 

如何使用綁定得到這個輸出:fff(ggg(kkk()))
這似乎並不工作:

boost::bind(fff<void()>, boost::bind(ggg<void()>, kkk))(); 
+0

'bind(&fff,&kkk)'? – Rapptz

+0

@Rapptz:'bind(&fff,&kkk)'也不起作用。 –

+0

您必須顯式傳遞模板參數,如boost :: bind(foo ,args)。你可以檢查相關的鏈接,可能有相當多的愚蠢。 – inf

回答

1
#include <iostream> 
#include <functional> 

template<class F> 
void fff(F fun) 
{ 
std::cout << "fff("; 
fun(); 
std::cout << ")" << std::endl; 
} 

void kkk() 
{ 
std::cout << "kkk()"; 
} 

int main() 
{ 
    // "Regular" call - OK 
    fff(kkk); 
    // you have to specify template parameters: 
    std::bind(&fff<void()>, &kkk)(); 
    return 0; 
} 

輸出爲:

[email protected] /work/tests $ g++11 -o bind_test bind_test.cc 
[email protected] /work/tests $ ./bind_test 
fff(kkk()) 
fff(kkk()) 

根據您的問題的第二部分:

的boost ::綁定(FFF,升壓: :bind(ggg,kkk))();

這不會編譯,因爲外部bind的參數不是void()類型! 它實際上是非常複雜的模板,絕對不能鑄造void()

+0

有沒有辦法根據參數自動推斷出這些,即'kkk()'? –

+0

@AdiShavit no。首先你要獲取一個函數的地址!在這一點上沒有調用,也沒有參數,所以你必須明確地指定你想要接收哪個'fff'的實例。 – zaufi

+0

回覆:第二部分:沒錯。這就是爲什麼我在尋找一種自動類型扣除的解決方案。 –

0

回答我...好像boost::bind是不走這裏的路。
我結束了這一點:

template <typename Fun> 
class FFF_t 
{ 
public: 
    FFF_t(Fun fun): realFun(fun) {} 

    void operator()() { invoke(); } 

    void invoke() 
    { 
     std::cout << "fff("; 
     realFun(); 
     std::cout << ")"; 
    } 
private: 
    Fun realFun; 
}; 

template<class Fun> 
FFF_t<Fun> fff(Fun fun) 
{ return FFF_t<Fun>(fun); } 

這讓我寫

fff(fff(kkk))(); 

這給fff(fff(kkk()))預期。 bind()仍然可以用作內部仿函數,如fff(fff(bind(some2argFun,1,2))))()

我無法弄清楚是如何使返回類型的invoke()operator()()的依賴於Fun()void中的例子)的返回類型。

給@Igor R.的帽子提示,他的評論讓我朝這個方向發展。