c++ - std::bind 与 std::shared_ptr

标签 c++ c++11 bind std shared-ptr

无法理解如何使用绑定(bind)到类函数的 shared_ptr。 在 USE 行发生错误,因为编译器无法将 shared_ptr 转换为 A

#include <functional>

class A {
    public:
        const bool check(void) const { return true; };
};

int _tmain(int argc, _TCHAR* argv[]) {
    const std::function<const bool(const A)> f_check = &A::check;
    auto a = std::make_shared<const A>();
    auto f_check_a = std::bind(f_check, a); // line BIND
    auto res = f_check_a(); // line USE - ERROR!!!

    return 0;
}

我可以替换 BIND 行来访问智能指针的实际值:

int _tmain(int argc, _TCHAR* argv[]) {
    auto f_check = &A::check;
    auto a = std::make_shared<const A>();
    auto f_check_a = std::bind(f_check, *a.get()); // line BIND
    auto res = f_check_a(); // line USE - NO ERRORS

    return 0;
}

现在代码已编译,可能会起作用。 但我想知道 - 使用智能指针的原始值是否可以接受?我可以以某种方式使用 shared_ptr 而不是原始值吗?

UPD2: 看起来我的同事找到了一个很好的解决方法:

class A {
    public:
        const bool check(void) const { return true; };
};

using p_func = const bool(A::*)() const;

int _tmain(int argc, _TCHAR* argv[]) {
    auto a = std::make_shared<const A>();
    p_func b = &A::check;
    auto f_check_a = std::bind(b, a);
    auto res = f_check_a();
}

现在我可以将 b 作为参数发送并绑定(bind)到 shared_ptr

更新: 我不能在实际任务中使用 lambda。 这是来自真实项目的更多代码:

#include <functional>
#include <algorithm>

class Block {
    public:
        const bool check1(void) const { return false; };
        const bool check2(void) const { return false; };
        const bool check3(void) const { return false; };
};

using block_t = std::shared_ptr<const Block>;

class Worker {
    private:
        std::vector<const block_t> _container;
    public:
        void processor(const std::function<const bool(const Block)> f_check) {
            block_t my_block = nullptr;
            auto lambda = [my_block, f_check](const block_t block) mutable {
                auto function_check = std::bind(f_check, *block.get());
                if (function_check()) {
                    my_block = block;
                    return true;
                }
                return false;
            };
            std::find_if(_container.begin(), _container.end(), lambda);
        }
};

void test(block_t block) {
    Worker worker;
    worker.processor(&Block::check1);
    worker.processor(&Block::check2);
    worker.processor(&Block::check3);
}

UPD3: 没有智能指针取消引用的固定代码:

#include <functional>
#include <algorithm>

class Block {
public:
    const bool check1(void) const { return false; };
    const bool check2(void) const { return false; };
    const bool check3(void) const { return false; };
};

using block_t = std::shared_ptr<const Block>;
using p_func = const bool(Block::*)() const;

class Worker {
private:
    std::vector<const block_t> _container;
public:
    void processor(p_func f_check) {
        block_t my_block = nullptr;
        auto lambda = [my_block, f_check](const block_t block) mutable {
            auto function_check = std::bind(f_check, block);
            if (function_check()) {
                my_block = block;
                return true;
            }
            return false;
        };
        std::find_if(_container.begin(), _container.end(), lambda);
    }
};

void test(block_t block) {
    Worker worker;
    worker.processor(&Block::check1);
    worker.processor(&Block::check2);
    worker.processor(&Block::check3);
}

最佳答案

你的问题是你首先创建了一个 std::function,期待一个 A 实例,来自一个成员函数,而不是试图将它绑定(bind)到一个 共享指针。你可以跳过那部分:

auto a = std::make_shared<const A>();
auto f_check_a = std::bind(&A::check, a);
auto res = f_check_a(); 

std::bind 知道如何将成员函数直接绑定(bind)到 shared_ptr

关于c++ - std::bind 与 std::shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21985230/

相关文章:

c++ - 为什么模板只能在头文件中实现?

c++ - 使用 getline 从文件中获取多行并将它们输入到不同的数组中

c++ - 错误 : 'ClassName' does not name a type

c++ - constexpr 可变参数模板和解包 std::array

C++ - boost 线程/绑定(bind)/Shared_ptr : Assert fault

c++ - 'this' 指针可以与对象的指针不同吗?

c++ - 在两个不同的命名函数之间进行选择的特征有什么替代方法?

c++ - =默认忽略访问说明符?

C++ 绑定(bind)到 weak_ptr 不工作

javascript - 绑定(bind)数组中不同元素的值 (JavaScript)