【问题标题】:std::bind header file declarationstd::bind 头文件声明
【发布时间】:2015-11-24 10:43:43
【问题描述】:

我想为 cpp 文件中的一个函数创建一个 std::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();
    }
}

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    为了确定,您知道您在标题中声明函数吗?为了匹配它,你的 cpp 文件应该更像:

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

    还要注意一些重要的事情,在您的情况下调用std::bind 将复制您的变量。因此,如果您希望生成的函数在创建后看到变量的变化,您应该给它一个参考:

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

    【讨论】:

    • 是的,标头声明是为了使函数可用于 main.cpp。无论如何,我知道我必须将“std::bind”“包装”在“std::function”中。没有办法让绑定本身在 cpp 文件之外可见吗?我也考虑过函子而不是绑定。它们之间有什么主要的性能差异吗?
    • 如果你总是使用相同的函数和参数类型,你可以这样使用它:using Type = decltype(std::bind(function, 1));,但它需要在之前声明函数。如果你不想在之前声明它,你需要添加一个抽象,它会在运行时占用一些资源(例如std::function)。仿函数不会像之前的例子那样高效,但我想应该比std::function 更好。但只有一种方法可以确定:测量。
    猜你喜欢
    • 2021-11-24
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多