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

时间:2018-04-23 10:30:55

标签: c++ c++17 deprecated

我想将我的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用法的例子。

2 个答案:

答案 0 :(得分:2)

&#34;它是一个自定义实现。&#34; - 严格来说,您不能在名称空间std中添加名称。这让你正式处理未定义的行为。所以即使在升级之前这也是一个坏主意。

自升级以来,使用std::mem_fn,或者如果你坚持使用lambda解决方案:

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

答案 1 :(得分:1)

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

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