在 C++ 中将容器类型作为模板的类型名传递
Pass a container type as the typename of a template in c++
我是 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);
}
我在编译时收到一条错误消息,指出 T 不是模板。
是否可以将容器的模板传递给函数的模板?
您可以将您的类型传递给您的模板化函数。编译器将检查对此函数的调用是否有效(即:它将检查对函数的每次调用是否使用具有 size()
方法的对象完成)。`
我修复了你的代码,试试看是否有效(未经测试)
template <typename T>
int find_size(const T &v)
{
return int(v.size());
}
int main()
{
std::array<int, 10> test;
for (int i = 0; i < 10; i++)
{
test[i] = i;
}
find_size(test);
return 0;
}
只需进行最少的更改即可使其正常工作,您的代码可能是这样的:
#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);
}
basically I want my function to be able to take an abritary type of container
这正是上面所做的。它适用于具有 size()
.
的任何容器类型 T
如果你真的想在模板而不是类型上参数化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);
}
但是,使用它要么比这里说明的更复杂,要么比上面的用途更有限:对于函数参数,你需要一个类型而不仅仅是一个模板,这个 find_size
只适用于一个具有 2 个参数的模板 C
,一个类型参数和一个 size_t
类型的非类型参数(我实际上不知道任何其他容器,但 std::array
具有该模板参数)。
TL;DR:这不是需要模板模板参数的用例。
Is it possible to pass the template of a container to the template of a function?
是的,但这里不需要。
T 是一个类型名称,因此调用 .size() 在这里没有任何意义。
如果你想要一个有类型的参数,你为什么要尝试使用模板?
您可以输入 return.
尝试
template <typename T>
int find_size(T a)
{
return (int) a.size();
}
我是 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);
}
我在编译时收到一条错误消息,指出 T 不是模板。 是否可以将容器的模板传递给函数的模板?
您可以将您的类型传递给您的模板化函数。编译器将检查对此函数的调用是否有效(即:它将检查对函数的每次调用是否使用具有 size()
方法的对象完成)。`
我修复了你的代码,试试看是否有效(未经测试)
template <typename T>
int find_size(const T &v)
{
return int(v.size());
}
int main()
{
std::array<int, 10> test;
for (int i = 0; i < 10; i++)
{
test[i] = i;
}
find_size(test);
return 0;
}
只需进行最少的更改即可使其正常工作,您的代码可能是这样的:
#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);
}
basically I want my function to be able to take an abritary type of container
这正是上面所做的。它适用于具有 size()
.
T
如果你真的想在模板而不是类型上参数化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);
}
但是,使用它要么比这里说明的更复杂,要么比上面的用途更有限:对于函数参数,你需要一个类型而不仅仅是一个模板,这个 find_size
只适用于一个具有 2 个参数的模板 C
,一个类型参数和一个 size_t
类型的非类型参数(我实际上不知道任何其他容器,但 std::array
具有该模板参数)。
TL;DR:这不是需要模板模板参数的用例。
Is it possible to pass the template of a container to the template of a function?
是的,但这里不需要。
T 是一个类型名称,因此调用 .size() 在这里没有任何意义。
如果你想要一个有类型的参数,你为什么要尝试使用模板? 您可以输入 return.
尝试
template <typename T>
int find_size(T a)
{
return (int) a.size();
}