在 C++ 中将容器类型作为模板的类型名传递

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 不是模板。是否可以将容器的模板传递给函数的模板?

for*_*818 6

只需进行最少的更改即可使其正常工作,您的代码可能是这样的:

#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:这不是需要模板模板参数的用例。

是否可以将容器的模板传递给函数的模板?

是的,但你在这里不需要它。