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;
}
問題沒有明確定義。一個函數(帶有operator()的類)可能會提供'operator()'的多個重載,並帶有不同數量和類型的參數。他們中的哪一個是你的行爲預期會採取行動? –
你不必擔心它,因爲'std :: bind'會綁定任何可調用對象的參數。然而,你還沒有完全解釋的一件事是你想要綁定每個參數到底是什麼。你不能只將一個參數綁定到未指定的東西上。 'std :: bind'的全部用途是爲函數參數分配一個離散值。那麼你究竟想要綁定什麼? –
@SamVarshavchik例如,我可能想要接受帶整型參數的函數,並將參數的位置綁定到它,例如foo(int a,int b,int c)將變爲foo(int a,1,2 ) –