我想使用函數指針和lambdas一起使用一個接口。我決定使用std::function
,但我很快發現它不能自己處理重載函數。如何使用一個接口傳遞函數指針和lambda's
實施例:
void foobar(double i_double){std::cout << "double argument" << i_double << std::endl;}
void foobar(){std::cout << "no argument" << std::endl;}
void foobar(int){std::cout << "int argument" << std::endl;}
std::function<void(double)> func = static_cast<void(*)(double)>(&foobar);
此代碼僅通過使用static_cast
編譯。由於在我們公司我們有相當多的超載功能,這太麻煩了。現在我決定實現兩個接口:一個用於std::function
對象,另一個用於函數指針,儘管我真的很想將函數指針也包裝在std::function
對象中(在調用端沒有附加代碼)。
這個問題的任何「很好」的解決方案?
編輯: 我將使用它的方式是一個大框架的一部分,但歸結爲下面的代碼。我希望下面的代碼清楚地說明用例。
namespace
{
bool IsAllowed(string) {...}
bool IsAllowed(int) {...}
}
CIteratorFilter<String>(listofstrings, IsAllowed);
CSomeObject object;
CIteratorFilter<String>(listofstrings,
[&object](String i_string) { return object.IsAllowed(i_string); }
);
目前這個CIteratorFilter需要實現兩個函數指針和std::function
接口,這是不是在我看來很不錯。
告訴我們你打算如何使用這個。它看起來像一個XY問題 – bolov