You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

替换含已弃用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:01:50