【发布时间】:2023-04-08 02:55:02
【问题描述】:
我可以专门化前向声明的模板吗?例如:
template <typename T> class A;
template <>
class A<char> {
char a[1000];
};
int main()
{
[[maybe_unused]] A<char> a;
return 0;
}
我想达到什么目标?
我们知道,我们必须专门化 std::hash 才能将它与一些基于哈希表的类型一起使用。标准的std::hash 特化需要在头文件中包含<functional>,然后对其进行特化。这个头文件我很多地方都用到了,<functional>的编译时间还是蛮大的。所以我想将我的专业转移到源 (cpp) 文件。
my_type.hpp:
class my_type {/*...*/};
namespace std {
template <typename T>
struct hash;
template <>
struct hash<my_type>
{
size_t operator()(my_type m) const;
};
} // namespace std
my_type.cpp:
#include "my_type.hpp"
#include <functional>
namespace std {
size_t std::hash<my_type>::operator()(my_type v) const
{
return std::hash<decltype(v.value())>{}(v.value());
}
} // namespace std
此解决方案有效,但就 ISO 标准而言是否合法?
编辑/注意: 它不适用于 libc++(clang std 实现),因为它将std::hash 定义为std::__1::hash,其中__1 是内联命名空间。这部分回答了这个问题。
【问题讨论】:
标签: c++ templates template-meta-programming