成员函数的 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))
{
}
我有以下 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))
{
}