Упреждающее объявление std::hash, чтобы избежать включения тяжелого стандартного заголовка [дубликат]C++

Программы на C++. Форум разработчиков
Anonymous
 Упреждающее объявление std::hash, чтобы избежать включения тяжелого стандартного заголовка [дубликат]

Сообщение Anonymous »

ПРИМЕЧАНИЕ. Нет, этот вопрос не является дубликатом предложенного. Мой вопрос не о том, как специализировать std::hash, а о том, разрешено ли предварительное объявление std::hash, чтобы избежать включения заголовка библиотеки.
Представьте, что у вас есть простой файл типа (в C++17):
#include

class C { /* definition */ };

namespace std {
template
struct hash {
std::size_t operator()(C const& c) const noexcept { return /* whatever */; }
};
}

Единственная причина, по которой мне нужно включить сюда , — это объявление std::hash, чтобы я мог написать свою собственную специализацию, но — это один из тех тяжелых заголовков, который добавляет около 200 мс времени компиляции вашего файла, просто включив его. Все остальные заголовки, которые также определяют std::hash для поддержки хеширования, например , или , основаны на шаблонах и тоже довольно тяжело.
Я знаю, что, как правило, вам не разрешено пересылать определения объявлений из стандартной библиотеки или писать собственные специализации, но поскольку std::hash по замыслу разрешено быть специализированным, могу ли я вместо этого переслать объявление, чтобы написать это?
class C { /* definition */ };

namespace std {
template hash;

template
struct hash {
std::size_t operator()(C const& c) const noexcept { return /* whatever */; }
};
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... ard-header

Вернуться в «C++»