替换含已弃用unary_function的自定义模板,升级VS程序至最新C++
替换已移除的
unary_function自定义模板方案 嘿,这个问题我升级C标准时也碰到过!从C17开始unary_function就被标记为弃用,C++20直接把它从标准库中移除了,咱们只需要手动给自定义模板补上它原来提供的类型特征就行。
原代码的核心依赖
原来的void_mem_fun_t继承unary_function<_Ty*, void>,本质只是为了获取两个标准类型别名:
argument_type:对应模板参数里的_Ty*result_type:对应模板参数里的void
修改后的兼容代码
我们去掉继承语句,在类内部手动添加这两个类型别名,就能完美替代原来的逻辑:
namespace std { template <class _Ty> class void_mem_fun_t { public: // 手动补上unary_function提供的类型别名 using argument_type = _Ty*; using result_type = void; 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); } }
额外建议
如果你的代码里还有其他依赖unary_function或binary_function的自定义适配器,都可以用同样的方式处理——直接在类内添加对应的类型别名即可。另外,要是你用的是C++11及以后的环境,更推荐用std::function或者lambda表达式替代这类旧式函数适配器,代码会更简洁易读,但针对你现有的自定义模板,上面的修改是最直接的兼容方案。
内容的提问来源于stack exchange,提问作者green.j
相关产品推荐
相关产品推荐

