У меня есть какой-то устаревший код, использующий массивы указателей функций для эмуляции обработчиков памяти.
Так что я сейчас пытаюсь использовать ту же функциональность, используя шаблоны.
Вот что я пробовал до сих пор:
template <typename R, typename ...ARGS> using function = R(*)(ARGS...);
template<size_t Size> using ReadType = function<SizedUInt<Size>, const uint32_t>;
// arrays to redeclare
std::array<ReadType<8>, memory_handler_size> read_8_handler_;
std::array<ReadType<16>, memory_handler_size> read_16_handler_;
std::array<ReadType<32>, memory_handler_size> read_32_handler_;
template<size_t Size>
void initializeReadHandler(uint32_t begin,
uint32_t end,
ReadType<Size> func) {
begin >>= 16;
end >>= 16;
for (uint32_t current = begin; current <= end; ++current) {
//read_handler_[current & 0xFFFF] = func;
}
}
Как я могу объявить массивы обработчиков чтения, чтобы инициализировать их с помощью шаблонной функции initializeReadHandler()
?
Я не хочу использовать std::function
, так как не могу позволить себе снизить производительность...
... EDIT ...
Вот код, основанный на ответе Якка, max66 замечаниях и некоторых небольших исправлениях (опечатка и т. Д.):
template <typename R, typename ...ARGS> using function = R(*)(ARGS...);
template<size_t S> using ReadType = function<SizedUInt<S>, const uint32_t>;
template<class ReadType>
using ReadHandlerType = std::array<ReadType, memory_handler_size>;
ReadHandler<8> read_8_handler_;
ReadHandler<16> read_16_handler_;
ReadHandler<32> read_32_handler_;
template<size_t S>
void initializeReadHandler(uint32_t begin,
uint32_t end,
ReadType<S> func) {
begin >>= 16;
end >>= 16;
auto t = std::tie(read_8_handler_, read_16_handler_, read_32_handler_);
for (uint32_t current = begin; current <= end; ++current) {
auto& handler = std::get < ReadHandler<S>& >(t);
handler[current & 0xFFFF] = func;
}
}
Работает как шарм: D Спасибо, ребята!