gpt4 book ai didi

c++ - std::bind 和 std::function 重叠还是互补?

转载 作者:搜寻专家 更新时间:2023-10-30 23:58:22 26 4
gpt4 key购买 nike

我在看 this exemple here ,结合 std::bind 和 std::function 来创建一个命令:非常简洁!命令类的代码如下:

class Command
{
private:
std::function<void ()> _f;

public:
command() {}
command(std::function<void ()> f) : _f(f) {}

template <typename T> void setFunction (T t) {_f = t ;}
void execute()
{
if(!_f.empty())
_f();
}
};

假设我有一个包含成员函数的类 MyClass:

class MyClass
{
public:
void myMemberFn() {}
}

调用代码如下:

MyClass myClass;

command(std::bind(&MyClass::myMemberFn, myClass));

尽管我必须承认我并不真正理解为什么除了 std::bind 之外还需要 std::function。在我看来,bind 已经封装了函数调用,为什么Command 中还需要函数呢? Command 不能存储 std::bind 而不是 std::function 吗?

我一直在查看 std::bind 的文档和 std::function并没有得到它......

有人知道为什么需要 std::function 吗?

PS:我假设 std::bind ~= boost::bind 和 std::function ~= boost::function

最佳答案

您必须将 std::bind 表达式的结果存储在某处。 std::bind 本身的返回类型未被标准指定,因此您不能创建该类型的命名成员变量(您可以使用 C++11 auto但是,创建这样一个局部变量!)

此外,任何采用 std::function 的函数都可以(由于 std::function 隐式转换)接受各种可调用对象,而不仅仅是 std::bind 结果 - 您可以将常规函数指针、lambda、自定义函数对象传递给它,任何可以调用的东西。

关于c++ - std::bind 和 std::function 重叠还是互补?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20757968/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com