我能专门化前置声明的模板吗?例如:
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是内联命名空间。这部分回答了问题。
libc++
就是这样做的。 - Mariusz Jaskółkastd:hash
模板特化时,才能提供。 - Marek R