2017-02-25 69 views
0

我正在嘗試編寫一個程序,該函數接受一個帶有任意非零數量參數的函數,並使用std :: bind將函數減少到只接受一個參數的函數。函數重載接受所有類型的函數

問題的後半部分是好的,但我希望用戶能夠輸入任何類型的函數 - std :: function,函數指針,函數或lambda - 並且我不知道如何編寫模板參數,它將接受最後兩種類型,並允許我推導該函數所需的參數數量。

請在下面的示例代碼中找到一個'foo'函數,它被重載以接受函數指針和std :: functions - 如果任何人都可以指出我如何寫正確的方向來寫另外兩個重載函數,感激。

#include <functional> 
#include <iostream> 

template <typename Ret, typename ParamA, typename... Params> 
unsigned int foo(const std::function<Ret(ParamA, Params...)>& f) 
{ 
    return sizeof...(Params); 
} 

template <typename Ret, typename ParamA, typename... Params> 
unsigned int foo(Ret(*f)(ParamA, Params...)) 
{ 
    return sizeof...(Params); 
} 

unsigned int foo(/*accepts a functor*/); 

unsigned int foo(/*accepts a lambda*/); 

std::function<void(int)> std_func([](int) {}); 
void f_ptr(int, int) {} 
struct functor { void operator() (int, int, int) {} }; 
auto lambda = [](int, int, int, int) {}; 

int main() 
{ 
    std::cout << foo(std_func); //Passed in a std::function 
    std::cout << foo(f_ptr); //Passed in a function pointer 
    std::cout << foo(functor()); //Passed in a functor 
    std::cout << foo(lambda); //Passed in a lambda 

    return 0; 
} 
+0

問題沒有明確定義。一個函數(帶有operator()的類)可能會提供'operator()'的多個重載,並帶有不同數量和類型的參數。他們中的哪一個是你的行爲預期會採取行動? –

+0

你不必擔心它,因爲'std :: bind'會綁定任何可調用對象的參數。然而,你還沒有完全解釋的一件事是你想要綁定每個參數到底是什麼。你不能只將一個參數綁定到未指定的東西上。 'std :: bind'的全部用途是爲函數參數分配一個離散值。那麼你究竟想要綁定什麼? –

+0

@SamVarshavchik例如,我可能想要接受帶整型參數的函數,並將參數的位置綁定到它,例如foo(int a,int b,int c)將變爲foo(int a,1,2 ) –

回答

0

事情是這樣的:

// Accepts a pointer to member function 
template <typename T, typename Ret, typename ParamA, typename... Params> 
unsigned int foo(Ret (T::*f)(ParamA, Params...)) 
{ 
    return sizeof...(Params); 
} 

// Accepts a pointer to const member function 
template <typename T, typename Ret, typename ParamA, typename... Params> 
unsigned int foo(Ret (T::*f)(ParamA, Params...) const) 
{ 
    return sizeof...(Params); 
} 

// Accepts a function object, including lambda and std::function 
template <typename F> 
unsigned int foo(const F& func) { 
    return foo(&F::operator()); 
}  

只適用一個函數對象與一個非超載operator()。由於std::function也是這樣一個對象,std::function的專用過載不再是必需的(但仍然需要一個用於普通函數指針)。

Demo

相關問題