c++ - std::bind on member with call operator

标签 c++ c++11

这可能是一件愚蠢而愚蠢的事情 - 但我想了解这里发生了什么。

我有以下代码:

#include <iostream>
#include <functional>

namespace
{
    struct call
    {
        void operator()() const
        {
            std::cout << "call::operator()" << std::endl;
        }
    };

    struct dummy
    {
        dummy() = default;
        dummy(const dummy&) = delete;

        call member;
    }; 
}

所以 member 本质上会像任何其他对象方法一样工作,允许它被调用为:

dummy d;
d.member()

这将打印 call::operator()

现在我想使用绑定(bind)来做到这一点,最初的实现是这样的:

int main() 
{
    dummy d;

    auto b = std::bind(&dummy::member, &d);
    b();
    return 0;
}

这会编译,但不会打印任何内容。我真的不明白发生了什么——它编译了,但没有产生输出这一事实让我感到困惑 :) std::bind 的内部确实发生了一些魔法,但是什么?

这是一个链接,可以玩代码: https://ideone.com/P81PND

最佳答案

目前,您的绑定(bind)返回一个成员,所以 b()d.member。 你必须调用 operator () :

b()(); // call::operator()

或者,您可以使用以下任何一种:

b = std::bind(&call::operator(), &d.member);
b = [&]() {d.member();};

关于c++ - std::bind on member with call operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43716713/

相关文章:

c++ - 检查所有可变参数模板参数的特征

c++ - 在 typeid 检查有效后使用 reinterpret_cast 吗?

c++ - vector<bool> 特化与 range base 不兼容

c++ - IO 完成端口初始读取和双向数据

c++ - gcc 使用 long 而不是 __int128 实例化模板

c++ - 在 C++ 文件中链接 mat.h

c++ - 如何将二维矩阵的 1 列传递给 C/C++ 中的函数

C++11 - 从函数传递向量作为迭代器

C++ 多态性/虚函数在这里不起作用

c++ - "vector iterator + offset out of range"断言有用吗?