模板数组长度作为参数

时间:2019-01-30 16:44:48

标签: c++ templates

我正在尝试学习有关C ++中模板的更多信息。我希望能够调用一个函数,在该函数中将类型和长度传递给它作为自变量。这可能吗?

template <class T>
void alloc_arr (int l) {
    std::allocator<T[l]> a;
}

alloc_arr<int[]>(64);

它不起作用,因为实例化类型必须在编译时固定(T[l]不固定)。

是否有其他方法不需要在类型(<T[64]>)中指定长度?

2 个答案:

答案 0 :(得分:5)

  

还有其他方法不需要在类型()中指定长度吗?

以某种方式,您需要将其作为模板参数传递

您可以按照Lourens Dijkstra的建议明确传递它

template <typename T, std::size_t Dim>
void alloc_arr ()
 {
   std::allocator<T[Dim]> a;
   // ...  
 }

或者,如果您至少可以使用C ++ 11,则也可以根据参数的类型推论得出。例如,

template <typename T, std::size_t Dim>
void alloc_arr (std::integral_constant<std::size_t, Dim> const &)
 {
   std::allocator<T[Dim]> a;
   // ...  
 }

或者也是

template <typename T, typename U>
void alloc_arr (U const &)
 {
   std::allocator<T[U::value]> a;
   // ...  
 }
例如,

alloc_arr调用std::integral_constant<std::size_t, 5u>{}

答案 1 :(得分:1)

您可以将大小传递为template parameter

template <class T, size_t size>
void alloc_arr() { ... }

这是唯一的方法。几天前,我发现将constexpr lambda作为常规参数视为格式不正确:Trying to pass a constexpr lambda and use it to explicitly specify returning type

此外,请注意,类型T应该为int;不是int[]

因此,调用alloc_arr:

alloc_arr<int, 64>();