我需要在查找库中设置大量的std :: vector。全部具有以下结构:
{N, N, ..., -N, -N}
我可以使用许多模板函数来做到这一点:
template<int N>
static constexpr std::initializer_list<int> H2 = {N, -N};
template<int N>
static constexpr std::initializer_list<int> H4 = {N, N, -N -N};
...
我可以简单地做到这一点:
std::vector<int> v22 = H2<3>
std::vector<int> v35 = H3<5>
etc.
但是有没有办法将数字2、4等也包括在内作为模板参数?
答案 0 :(得分:1)
是的,可以通过使用std::integer_sequence
和变量模板专门化来实现:
template <typename, int N>
static constexpr std::initializer_list<int> HImpl;
template <int N, int... Is>
static constexpr std::initializer_list<int> HImpl<std::index_sequence<Is...>, N>
= {(Is < sizeof...(Is) / 2) ? N : -N...};
template <int Count, int N>
static constexpr auto H = HImpl<std::make_index_sequence<Count>, N>;
用法:
int main()
{
std::vector<int> v = H<10, 1>;
for(int x : v) std::cout << x << ' ';
}
输出:
1 1 1 1 1 -1 -1 -1 -1 -1