您可以使用std :: bind(或其他方法)更改返回类型吗?

时间:2019-01-30 07:22:50

标签: c++ c++11 stdbind

说我有一个功能,

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,但是其他任何东西也都很好。

3 个答案:

答案 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以来已过时。