模板数组长度作为参数

Template array length as argument

本文关键字:参数 数组      更新时间:2023-10-16

我正在尝试了解有关C++模板的更多信息。我希望能够调用一个函数,在其中我传递一个类型和长度作为参数。这可能吗?

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

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

有没有其他方法可以做到这一点,不需要在类型(<T[64]>)中指定长度?

有没有其他方法可以做到这一点,不需要在类型()中指定长度?

在某种程度上,您需要将其作为模板参数传递

你可以按照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;
   // ...  
 }

举例来说,用std::integral_constant<std::size_t, 5u>{}调用alloc_arr

您可以将大小作为template parameter传递:

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

这是唯一的办法。几天前,我发现将constexpr lambda作为常规参数传递被认为是格式错误的: 尝试传递 constexpr lambda 并使用它来显式指定返回类型

另外,请注意类型 T 应该是 int 的,而不是int[]的。

因此,调用alloc_arr:

alloc_arr<int, 64>();