C++如何编写支持2/3模板参数的multimap_util工具类
问题解决方法
错误原因
你遇到的编译错误核心原因是当前定义的multimap_util模板强制要求传入3个类型参数,未给第三个比较器参数设置默认值,因此仅传2个参数的调用场景无法通过编译。
解决方案
不需要用模板偏特化或者子类继承,给第三个模板参数设置默认值即可满足需求,全程没有用到可变参数模板,符合你的限制要求:
- 将第三个模板参数的默认值指定为
std::multimap默认使用的比较器std::less<T1>,既支持传2个参数的默认排序场景,也支持传3个参数的自定义排序场景 - 合并冗余的构造函数,当模板参数C使用默认值时,
std::multimap<T1, T2, C>就等价于默认排序的std::multimap<T1, T2>,不需要单独写两个重载
修改后的完整代码
#include <map> #include <functional> // 引入std::less头文件 template <typename T1, typename T2, typename C = std::less<T1>> class multimap_util { std::multimap<T1, T2, C>* map; public: explicit multimap_util(std::multimap<T1,T2,C>& map) : map(&map) {}; // 你原来的其他工具方法可以直接保留在这里 };
两种使用场景验证
默认排序场景
std::multimap<int, int> m; multimap_util<int, int> mu( m ); // 自动使用默认的std::less<int>作为第三个参数,编译通过
自定义排序场景
// 自定义比较器示例 struct string_size_more { bool operator()(const std::string& a, const std::string& b) const { return a.size() > b.size(); } }; std::multimap<std::string, std::string, string_size_more> lmm; multimap_util<std::string, std::string, string_size_more> lmmu( lmm ); // 传入自定义比较器,编译通过
内容的提问来源于stack exchange,提问作者Bufer
相关产品推荐
相关产品推荐

