在 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();
}