C ++:基于整数模板参数创建可变长度元组

时间:2018-01-16 16:45:14

标签: c++ c++14 variadic-templates template-meta-programming

我正在编写一个库,它具有在无符号整数上模板化的编译时多态对象,

template<unsigned level> class Foo { ... };

,即Foo&lt; 0&gt;,Foo&lt; 1&gt;,Foo&lt; 2&gt;。等等由每个申请确定的一定数量。假设我们的应用程序指定需要数字0,1,...,n。

我需要能够通过调用一个可变参数模板函数来构造一个指向这些对象的指针向量元组:std::tuple<std::vector<Foo<n> *>, std::vector<Foo<n-1> *>, ..., vector<Foo<0> *>>

template <unsigned n> 
std::tuple<unsigned n, unsigned... Args> create_vector_tuple<n>()

或类似的东西。

我的直觉告诉我,这应该是可以实现的,虽然我已经超出了我的深度。

如果有人能指出我实施此方法的话,我将非常感激!

1 个答案:

答案 0 :(得分:4)

如下所示:

#include <cstdio>
#include <tuple>
#include <vector>
#include <utility>

template<unsigned level> struct Foo {};

template<unsigned N, unsigned... Ns>
std::tuple<std::vector<Foo<N - Ns>*>...> create_vector_tuple_imp(std::integer_sequence<unsigned, Ns...>) {
    return {};
}

template <unsigned n>
auto create_vector_tuple() {
    return create_vector_tuple_imp<n>(std::make_integer_sequence<unsigned, n>{});
}

template<class T>
void print() {
    std::printf("%s\n", __PRETTY_FUNCTION__);
}

int main() {
    auto t = create_vector_tuple<10>();
    print<decltype(t)>();
}

输出:

void print() [with T = std::tuple<std::vector<Foo<10u>*, std::allocator<Foo<10u>*> >, std::vector<Foo<9u>*, std::allocator<Foo<9u>*> >, std::vector<Foo<8u>*, std::allocator<Foo<8u>*> >, std::vector<Foo<7u>*, std::allocator<Foo<7u>*> >, std::vector<Foo<6u>*, std::allocator<Foo<6u>*> >, std::vector<Foo<5u>*, std::allocator<Foo<5u>*> >, std::vector<Foo<4u>*, std::allocator<Foo<4u>*> >, std::vector<Foo<3u>*, std::allocator<Foo<3u>*> >, std::vector<Foo<2u>*, std::allocator<Foo<2u>*> >, std::vector<Foo<1u>*, std::allocator<Foo<1u>*> > >]