我正在尝试使用一个接口一起使用函数指针和lambdas。我决定使用std::function
,但我很快发现它本身不能处理重载函数。
示例:
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
对象中(不需要额外的代码)主叫方)。
任何&#34;很好&#34;解决这个问题?
编辑: 我将使用它的方式是大型框架的一部分,但归结为下面的代码。我希望下面的代码能够清楚地说明用例。
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
接口,这在我看来并不是很好。
答案 0 :(得分:1)
请参阅...... XY问题。
不需要这个或类似的东西:
std::function<void(double)> func = static_cast<void(*)(double)>(&foobar);
您需要使用模板:
template <class Func>
CIteratorFilter<String>( listofstrings, Func func) {
// call func whatever it may be function pointer, lambda, callable object:
func(..whatever params...);
}
如果你想要<{sub>
,你可以使用func
完美的fowarding
答案 1 :(得分:0)
为什么不使用带有正确参数的非捕获lambda并调用std::function<void(double)> func = [](double d){ foobar(d); };
函数?
像
fopen
这是我能想到的最好的。
答案 2 :(得分:0)
使用C ++ 11功能和宏魔法。
email folder
用法:
#define FUNCTION(RETURN, NAME, ...) \
std::function<RETURN (__VA_ARGS__)>(static_cast<RETURN(*)(__VA_ARGS__)>(&NAME))
如果您不想使用变量参数,则下面是另一种方法:
auto func1 = FUNCTION(void, foobar, double);
auto func2 = FUNCTION(void, foobar);
auto func3 = FUNCTION(void, foobar, int);
用法:
#define FUNCTION(RETURN, NAME, PARAMETERS) \
std::function<RETURN PARAMETERS>(static_cast<RETURN(*)PARAMETERS>(&NAME))