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