c++ - 无法将 std::bind 的返回值转换为 void 函数指针

标签 c++ c++14 c++17 std-function stdbind

我是函数库的新手。我想将静态类方法与类的对象绑定(bind),并返回指向该函数的 void 指针。我尝试使用 std::bind 但它无法将类成员函数转换为指向该函数的自由 float 指针

这是我的测试代码:

class base{
    void (*fn)();
    int m_var;
public:
    base(int var): fn(std::bind(print, this)), m_var(var){
        std::cout << "base ctor\n";
        fn(); //something like this. fn should be a void pointer to the function.
    }

    static void print(base *b){
        std::cout << b->m_var << "\n";
    }
};

int main(){
    base *b = new base(5);
    return 0;
}

这是我得到的错误:

error: cannot convert ‘std::_Bind_helper<false, void (&)(base*), base*>::type’ {aka ‘std::_Bind<void (*(base*))(base*)>’} to ‘void (*)()’ in initialization

我知道我无法将类成员转换为自由 float 函数,但我需要 std::bind 的返回类型为 void 指针,因为这是我正在使用的外部库之一的输入。如有任何帮助/建议,我们将不胜感激。

最佳答案

不幸的是,您无法将 std::bind 的结果转换为函数指针,原因很简单。让我们尝试想象一下 std::bind 是如何工作的。您有一个带有一些参数和值的函数,并且您想要获得可以在没有参数的情况下调用的可调用内容。在运行时不生成新代码的唯一可能的方法是创建一个函数对象,该对象存储原始函数和带有重载 operator() 的绑定(bind)参数。实际上 std::_Bind_helper 与此描述非常相似。

因此,您会得到一个具有某些成员的某种类型的对象。因此它不能以某种方式转换为指向不能存储任何参数的函数的指针。

关于c++ - 无法将 std::bind 的返回值转换为 void 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57400372/

相关文章:

c++ - 使用 Windows Imaging Component 将 EMF 转换为 BMP(元文件到位图)

c++ - 如何在 C++ 中遍历 LPBYTE 的每个字节

C++字符串到C char数组以写入二进制文件

c++ - c_str() 的要求是否使修改非法?

c++ - 为什么双端队列比队列快?

c++ - SFINAE 重载,必须考虑哪些规则

c++ - 十六进制值到 wchar_t 字符 (UTF-8) 的转换

c++ - 返回值优化: Explicit move or implicit?

c++17 - 如何检查模板中的结构是否具有 BOOST_HANA_ADAPT_STRUCT?

c++ - 使用 -lstdc++fs 选项后使用 GCC6 时出现实验性::文件系统链接器错误