替换包含已弃用的一元函数的自定义模板
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(); } )
);
我想将我的 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(); } )
);