我正在使用指向函数的指针数组。由于某些元素不能用函数模板表达,所以我写了这样的代码。
extern void zero(); // isr 0 is defined somewhere else
void one() {
// isr 1
}
template <std::size_t N>
void Nth() {
// isr N
}
using func = void (*)();
constexpr func interrupt_vector[256] = {
&zero,
&one,
&Nth<2>,
&Nth<3>,
...
&Nth<254>,
&Nth<255>,
};
我读过有关使用可变参数模板生成静态表的内容,但那些都是关于初始化整个数组的。
如何简化代码?
@ 其实是中断 vector 的一部分。因为它应该被直接调用,所以我不能使用模板特化,例如
template <>
void Nth<0>() {
zero();
}
@@ 编辑了代码。我认为 cout 的事情令人困惑。
最佳答案
如果您可以更改为使用 std::array
,那么这样的事情就可以了。
using func = void (*)();
template<int...>
struct index_sequence { };
template<int From, int N, int... Is>
struct make_index_sequence_from : make_index_sequence_from<From, N - 1, N - 1, Is...> { };
template<int From, int... Is>
struct make_index_sequence_from<From, From, Is...> : index_sequence<Is...> { };
template<int... Is> constexpr
std::array<func, 256> make_interrupt_vector_array(index_sequence<Is...>)
{
return {{zero, one, Nth<Is>...}};
}
constexpr
std::array<func, 256> make_interrupt_vector_array()
{
return make_interrupt_vector_array(make_index_sequence_from<2, 256>());
}
constexpr auto interrupt_vector = make_interrupt_vector_array();
关于c++ - 如何在编译时使用手动给定的一些元素初始化数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21677669/