成员函数的 lambda iso std::bind

lambda iso std::bind for member function

我有以下 class 我 运行 clang-tidy。

template<typename Foo>
class Bar
{
public:

    template<class THandlerObj>
    Bar(void (THandlerObj::*pCmdHandler)(const Foo&), 
              THandlerObj* pCmdHandlerContext)          
        : m_cmdHandlerFunc(std::bind(pCmdHandler, pCmdHandlerContext, std::placeholders::_1))
       {
       }

private:
    std::function<void(const Foo&)> m_cmdHandlerFunc;
}

Clang 告诉我应该使用 lambda 函数而不是 std::bind。但是我无法直接理解语法。我正在努力解决一个应该在上下文中调用的成员函数的事实,但我不知道该怎么做。

您可以使用lambda 的捕获列表来捕获成员函数指针和对象指针,并在lambda 内部调用它们。试试这个:

#include <functional>

template<typename Foo>
class Bar
{
public:

    template<class THandlerObj>
    Bar(void (THandlerObj::*pCmdHandler)(const Foo&), 
              THandlerObj* pCmdHandlerContext)          
        : m_cmdHandlerFunc(
            [=](const Foo& foo) { (pCmdHandlerContext->*pCmdHandler)(foo); })
        {
        }

private:
    std::function<void(const Foo&)> m_cmdHandlerFunc;
};

如果你的编译器支持C++20,你也可以使用std::bind_front,它比std::bind.

更轻量和直观
template<class THandlerObj>
    Bar(void (THandlerObj::*pCmdHandler)(const Foo&), 
              THandlerObj* pCmdHandlerContext)          
        : m_cmdHandlerFunc(std::bind_front(pCmdHandler, pCmdHandlerContext))
        {
        }