我正在尝试学习有关C ++中模板的更多信息。我希望能够调用一个函数,在该函数中将类型和长度传递给它作为自变量。这可能吗?
template <class T>
void alloc_arr (int l) {
std::allocator<T[l]> a;
}
alloc_arr<int[]>(64);
它不起作用,因为实例化类型必须在编译时固定(T[l]
不固定)。
是否有其他方法不需要在类型(<T[64]>
)中指定长度?
答案 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>();