c++ - std::bind 头文件声明

标签 c++ c++11 header-files declaration stdbind

我想为我的主文件以外的 cpp 文件中的函数创建一个 std::bind,并且也在不同的命名空间中。我遇到的问题是如何在头文件中声明所述函数,因为绑定(bind)本身取决于 main.cpp 不可用的变量。

是这样的:

函数.cpp

#include "function.h"
namespace A{
    void function(int i) { ... }   // supposed to be invisible from outside
    namespace A1{
        int varA1;
        auto func = std::bind(A::function, varA1);
    }
    namespace A2{
        int varA2;
        auto func = std::bind(A::function, varA2);
    }
}

函数.h

namespace A{
    namespace A1{
        auto func();
    }
    namespace A1{
        auto func();
    }
}

我知道上面的示例不起作用,但我该如何更改头文件以修复它?

最佳答案

我能看到的唯一解决方案是使用 std::function,因为它几乎是唯一可以接受具有已定义类型的 bind 对象的对象.

所以,如果我正确阅读了您的代码,它应该返回如下内容:

std::function<void()> func();

可以肯定的是,您知道您在 header 中声明了函数吗?为了匹配它,您的 cpp 文件应该更像:

namespace A1{
    std::function<void()> func() {
        int varA1;
        return std::bind(A::function, varA1);
    }
}

还要注意一些重要的事情,在您的情况下调用 std::bind 将复制您的变量。所以如果你想让你的结果函数在创建后看到你的变量的变化,你应该给它一个引用:

std::bind(A::function, std::cref(varA1));

关于c++ - std::bind 头文件声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33891477/

相关文章:

c++11 - 具有 const 容器问题的基于范围的 for 循环

c++ - 参数包构造函数优于其他构造函数调用

c++ - 为什么输出不是预期的那样?

c++ - 调用 std::map::find 时出现 "map/set iterators incompatible"

c++ - OSX 与 Linux : how to deal with unsigned long and uint64_t?

c++ - 我可以在命名空间中包含头文件吗?

c++ - 了解动态链接在 UNIX 上的工作原理

c++ - 脚本语言可以翻译成其他语言吗?

c - 将调用上下文 GCC 预处理器宏值传播到目标函数

c++ - Visual C++ 和 Allegro5 : cannot recognize objects from abstract class from header file