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

Replacing custom template who contain deprecated unary function

我想将我的 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::mem_fn 而不是 void_mem_fun(因此也可以删除 class 模板)。

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

"It's a custom implementation." - 严格来说,您不能将名称添加到命名空间 std。这使您正式拥有未定义的行为。所以即使在升级之前也是个坏主意。

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

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