从模板参数初始化initializer_list

时间:2018-09-28 10:43:32

标签: c++11 templates template-meta-programming

我需要在查找库中设置大量的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等也包括在内作为模板参数?

1 个答案:

答案 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 

live example on wandbox.org