luw*_*arz 1 c++ containers templates std
我是 C++ 模板的初学者,我想知道是否可以将容器传递给模板函数的类型名,这就是我想要做的:
template <typename T>
int find_size(const T<int> t)
{
return (t.size());
}
int main(void)
{
std::array<int, 10> test;
for (int i = 0; i < 10; i++)
{
test[i] = i;
}
findsize(test);
}
Run Code Online (Sandbox Code Playgroud)
当我编译时,我收到一条错误消息,指出 T 不是模板。是否可以将容器的模板传递给函数的模板?
只需进行最少的更改即可使其正常工作,您的代码可能是这样的:
#include <array>
template <typename T>
int find_size(const T& t)
{
return (t.size());
}
int main(void)
{
std::array<int, 10> test;
for (int i = 0; i < 10; i++)
{
test[i] = i;
}
find_size(test);
}
Run Code Online (Sandbox Code Playgroud)
基本上我希望我的函数能够采用任意类型的容器
这正是上面所做的。它适用于任何T具有size().
如果您实际上想find_size对模板而不是类型进行参数化,那么您可以使用模板模板参数:
#include <array>
template <template<class,std::size_t> class C>
int find_size(const C<int,10>& t)
{
return (t.size());
}
int main(void)
{
std::array<int, 10> test;
for (int i = 0; i < 10; i++)
{
test[i] = i;
}
find_size<std::array>(test);
}
Run Code Online (Sandbox Code Playgroud)
然而,使用它要么比这里说明的更复杂,要么比上面的用途更有限:对于函数参数,您需要一个类型而不仅仅是一个模板,并且这只find_size适用于C具有 2 个参数的模板,一个类型和类型的一个非类型参数size_t(实际上我不知道除了std::array该模板参数之外还有任何其他容器)。
TL;DR:这不是需要模板模板参数的用例。
是否可以将容器的模板传递给函数的模板?
是的,但你在这里不需要它。