如何使用一个接口传递函数指针和lambda

时间:2015-05-29 12:27:50

标签: c++11 lambda

我正在尝试使用一个接口一起使用函数指针和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接口,这在我看来并不是很好。

3 个答案:

答案 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))