说我有一个功能,
bool my_func(bool input_val) { return !input_val; }
我想将其作为一个返回void并且不做任何事情的函数传递给它,所以它就像:
bool the_truth = true;
void func_taking_a_void_func(std::function<void()> void_func) {};
func_taking_a_void_func([the_truth]() -> void { my_func(the_truth); });
我首先尝试使用std::bind
,但很自然,编译器无法使用my_func
,因为它返回的是布尔值而不是void。
func_taking_a_void_func(std::bind(my_func, the_truth));
是否可以做一个std::bind_and_ignore_return_type
之类的事情,而不仅仅是用lambda包装对函数的调用?我在VS2013上使用的是C ++ 11,但是其他任何东西也都很好。
答案 0 :(得分:0)
您不能使用std::bind
或捕获变量的lambda将其传递给需要函数指针的函数。当Lambda不捕获任何变量时,它们可以转换为函数指针。 std::bind
的结果永远不会。
答案 1 :(得分:0)
不清楚您的问题是什么,但是无论如何,这不使用lambda。
#include<type_traits>
template<class F>
struct adapt{
bool arg_;
F f_;
adapt(bool arg, F f) : arg_{arg}, f_{f}{}
void operator()() const{f_();}
};
template<class F> adapt<F> make_adapt(bool b, F f){return adapt<F>(b, f);}
template<class F> int func_taking_a_void_func(F&& f){
static_assert(std::is_same<decltype(f()), void>{}, "!");
return 5;
}
bool my_func(bool input_val) { return !input_val; }
int main(){
bool the_truth = true;
func_taking_a_void_func(make_adapt(the_truth, my_func));
}
答案 2 :(得分:0)
论点bool input_val
必须来自 somewhere 。
如果您真的只有一个标志,则可以执行两个功能
void my_true_func() { my_func(true); }
void my_false_func() { my_func(false); }
然后根据标志选择一个或另一个。
否则,bool input_val
必须是可从任何地方访问的全局/线程局部变量。
您不能使用lambda捕获,否则会将lambda从函数转换为结构。但是,如果上面的解决方案没有帮助,唯一的方法就是使用函子而不是函数指针。
请注意,std::bind
不能捕获任何东西,并且自引入lambda以来已过时。