gpt4 book ai didi

c++ - 在现代 C++ 中使用模板替换函数指针数组

转载 作者:行者123 更新时间:2023-11-27 23:42:58 24 4
gpt4 key购买 nike

我有一些遗留代码使用函数指针数组来模拟内存处理程序。
所以我现在正尝试使用模板实现相同的功能。
到目前为止,这是我尝试过的:

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 因为我负担不起性能开销 ...

...编辑...
这是基于 Yakk 的回答、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 谢谢你们!

最佳答案

如果我理解正确并且您不想维护 read_8_handler_read_16_handler_read_32_handler_ 全局变量(一种),我想您可以将它们作为静态变量包装在模板函数中(根据 Quentin 的建议进行了大幅简化)

作为

 template <std::size_t S>
std::array<ReadType<S>, memory_handler_size> & getHandler ()
{ static std::array<ReadType<S>, memory_handler_size> h; return h; }

因此您可以使用推导的Size 模板参数来选择请求的函数

template<size_t Size>
void initializeReadHandler(uint32_t begin,
uint32_t end,
ReadType<Size> func) {
begin >>= 16;
end >>= 16;

auto & handler = getHandler<Size>();

for (uint32_t current = begin; current <= end; ++current) {
handler[current & 0xFFFF] = func;
}
}

但是,如果可能的话,我建议您将数组(通过引用)作为参数传递给函数。

关于c++ - 在现代 C++ 中使用模板替换函数指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53026271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com