【问题标题】:Can you use std::bind (or something else) to change return type?您可以使用 std::bind (或其他)来更改返回类型吗?
【发布时间】:2019-01-30 07:22:49
【问题描述】:

假设我有一个函数,

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,因为它返回一个bool而不是void。

func_taking_a_void_func(std::bind(my_func, the_truth));

是否可以执行类似std::bind_and_ignore_return_type 的操作,而无需使用 lambda 封装对函数的调用?我在 VS2013 上使用的是 C++11,但其他的也很好。

【问题讨论】:

  • lambda函数有什么问题?
  • 我已经猜到了,但是“编译器说了一些关于函数返回值的内容,并且无法转换”对于一个可靠的答案来说不够详细。当您寻求编译器错误的帮助时,您应该始终发布一个独立的 sn-p 来重现您的问题,并且您应该始终发布您在尝试构建它时遇到的确切错误。
  • func_taking_a_void_func 的签名是什么。 func_taking_a_void_func(void(*)())?请发布工作代码。
  • 请提供minimal reproducible example“说明函数返回值,无法转换。”,粘贴。
  • @alfC void func_taking_a_void_func(std::function&lt;void()&gt;),我应该先把它放在那里,谢谢!

标签: c++ c++11 stdbind


【解决方案1】:

您不能使用std::bind 或捕获变量的lambda 将其传递给需要函数指针的函数。 Lambda 在不捕获任何变量时可转换为函数指针; std::bind 的结果永远不会。

【讨论】:

    【解决方案2】:

    不清楚你的问题是什么,但无论如何,这不使用 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));
    }
    

    【讨论】:

      【解决方案3】:

      那么bool input_val 的论点必须来自某个地方

      如果你真的只有一个标志,你可以做两个功能

      void my_true_func() { my_func(true); }
      void my_false_func() { my_func(false); }
      

      并根据标志选择一个或另一个。

      否则bool input_val 必须是可从任何地方访问的全局/线程局部变量。

      您不能使用 lambda 捕获,这样做会将 lambda 从函数转换为结构。但如果上面的解决方案没有帮助,唯一的办法就是使用仿函数而不是函数指针。

      请注意,std::bind 无法捕获任何内容,并且自引入 lambda 以来已基本过时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-29
        • 2016-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-27
        相关资源
        最近更新 更多