Can I specialize forward declared template? For example:
template <typename T> class A;
template <>
class A<char> {
char a[1000];
};
int main()
{
[[maybe_unused]] A<char> a;
return 0;
}
What do I want to achieve?
As we know, we have to specialize std::hash
to use it with some hash-table-based types. Standard std::hash
specialization requires to include <functional>
in the header file and then specialize it. I use this header file in many places, and the compilation time of <functional>
is pretty big. So I want to move my specialization to source (cpp) file.
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
This solution works, but is it legal in terms of ISO standard?
EDIT/NOTE: It doesn't work with libc++ (clang std implementation), because it defines std::hash
as std::__1::hash
, where __1
is inline namespace. This partially answers the question.
libc++
does it. – Indefectible