该标准说明了以下关于标准库中的特殊化模板(通过什么可以而且我不能专注于std命名空间?)
只有当声明取决于用户定义的类型并且特化符合原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板特化添加到命名空间std.
使用专用于用户定义类的标准库类来专门化标准库模板是否合法?
例如,专门std::hash为std::shared_ptr<MyType>?
通过阅读上段和相关问题,听起来应该如此,因为专业化的宣言依赖于MyType,但"除非明确禁止",否则我会稍微担心.
下面的示例编译并按预期工作(AppleClang 7.3),但它是否合法?
#include <unordered_set>
#include <memory>
#include <cassert>
#include <string>
struct MyType {
MyType(std::string id) : id(id) {}
std::string id;
};
namespace std {
template<>
struct hash<shared_ptr<MyType>> {
size_t operator()(shared_ptr<MyType> const& mine) const {
return hash<string>()(mine->id);
}
};
template<>
struct equal_to<shared_ptr<MyType>> {
bool operator()(shared_ptr<MyType> const& lhs, shared_ptr<MyType> const& rhs ) const {
return lhs->id == rhs->id;
}
};
}
int main() {
std::unordered_set<std::shared_ptr<MyType>> mySet;
auto resultA = …Run Code Online (Sandbox Code Playgroud)