替换包含已弃用的一元函数的自定义模板

Replacing custom template who contain deprecated unary function

本文关键字:一元 函数 自定义 包含 替换      更新时间:2023-10-16

我想将我的Visual Studio程序升级到C++latsest。 正如我所看到的,unary_function被删除了。

这是我使用一元的实际代码

namespace std
{
template <class _Ty>
class void_mem_fun_t: public unary_function<_Ty*, void>
{
public:
explicit void_mem_fun_t(void (_Ty::*_Pm)()): _Ptr(_Pm)
{
}
void operator()(_Ty* _P) const
{
((_P->*_Ptr)());
}
private:
void (_Ty::*_Ptr)();
};
template<class _Ty> inline
void_mem_fun_t<_Ty> void_mem_fun(void (_Ty::*_Pm)())
{
return (void_mem_fun_t<_Ty>(_Pm));
}
}

这是一个自定义实现。 和用法:

for_each(
OneVector.begin(),
OneVector.end(),
std::void_mem_fun(&SomeClass::UseFunc)
);

我可以使用 lambda 作为替代品吗?或者你的建议是什么? 我需要一个关于 lambda 用法的示例。

"这是一个自定义实现。 - 严格来说,不允许将名称添加到命名空间std中。这给你留下了正式的未定义的行为。因此,即使在升级之前,这也是一个坏主意。

由于您升级了,请使用std::mem_fn,或者如果您坚持使用 lambda 解决方案:

for_each(
OneVector.begin(),
OneVector.end(),
[](auto *s) { return s->UseFunc(); } )
);

如果我正确理解代码,您需要做的就是使用std::mem_fn而不是您的void_mem_fun(因此也可以删除类模板)。

auto a = std::mem_fn(&C::foo)之后,a是一个可调用的对象,它接受类型为C*C&的参数并对其调用foo