使用Boost 1.71的BOOST_STRONG_TYPEDEF定义std::string强类型遇问题求助
解决Boost 1.71 BOOST_STRONG_TYPEDEF的两个常见问题
问题1:unordered_map哈希器编译错误
std::hash并未为BOOST_STRONG_TYPEDEF生成的StrongString提供默认特化,这是编译报错的核心原因,提供两种解决方式:
方式1:特化std::hash
在全局命名空间下添加特化代码,让标准库能识别StrongString的哈希逻辑:
#include <functional> #include <string> #include <boost/strong_typedef.hpp> BOOST_STRONG_TYPEDEF(std::string, StrongString); namespace std { template<> struct hash<StrongString> { size_t operator()(const StrongString& s) const { return std::hash<std::string>()(s.t); } }; }
之后直接使用std::unordered_map<StrongString, int>即可,无需显式指定哈希器。
方式2:指定自定义哈希器
若不想修改std命名空间,可直接在unordered_map定义时传入自定义哈希结构体:
struct StrongStringHash { size_t operator()(const StrongString& s) const { return std::hash<std::string>()(s.t); } }; std::unordered_map<StrongString, int, StrongStringHash> umap;
问题2:运算符与成员函数无法直接调用
BOOST_STRONG_TYPEDEF生成的强类型不会自动继承原类型(std::string)的成员函数和运算符,需手动添加支持:
1. 重载运算符
以operator+=为例,为StrongString实现对应运算符重载:
// 支持std::string类型的拼接 inline StrongString& operator+=(StrongString& lhs, const std::string& rhs) { lhs.t += rhs; return lhs; } // 支持const char*类型的拼接 inline StrongString& operator+=(StrongString& lhs, const char* rhs) { lhs.t += rhs; return lhs; }
2. 转发成员函数
对于length()这类成员函数,可通过两种方式转发:
- 全局函数转发:
inline size_t length(const StrongString& s) { return s.t.length(); }
- 继承
boost::strong_typedef模板类,添加成员函数(替代BOOST_STRONG_TYPEDEF宏):
#include <boost/strong_typedef.hpp> #include <string> class StrongString : public boost::strong_typedef<StrongString, std::string> { public: // 继承基类的构造函数 using boost::strong_typedef<StrongString, std::string>::strong_typedef; size_t length() const { return this->t.length(); } // 可按需添加其他需要的成员函数,如size()、empty()等 };
内容的提问来源于stack exchange,提问作者intrigued_66
相关产品推荐
相关产品推荐

