【问题标题】:Pass a container type as the typename of a template in c++将容器类型作为 C++ 中模板的类型名传递
【发布时间】:2021-12-28 12:41:33
【问题描述】:

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

【问题讨论】:

  • 应该是find_size(const T&amp; t),然后是return t.size()
  • 你真正想要实现什么?在你的find_size T 曾经被用作一种类型,一次被用作模板,一次被用作对象
  • 我纠正了我的错误,基本上我希望我的函数能够采用 abritary 类型的容器

标签: c++ templates containers c++-standard-library


【解决方案1】:

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

#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);
}

基本上我希望我的函数能够采用 abritary 类型的容器

这正是上面所做的。它适用于任何具有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 只能与模板一起使用 @987654327 @ 有 2 个参数,一个类型和一个类型为 size_t 的非类型参数(实际上我不知道任何其他容器,但 std::array 具有该模板参数)。


TL;DR:这不是需要模板模板参数的用例。

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

是的,但这里不需要。

【讨论】:

  • 感谢您的回答!我仍然对模板感到困惑,所以我认为做我想做的事情会更复杂
【解决方案2】:

您可以将您的类型传递给您的模板化函数。编译器将检查对该函数的调用是否有效(即:它将检查对您的函数的每次调用是否使用具有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;
}

【讨论】:

  • void main 不是 C++。不要使用它。
  • @AnoopRana 我的错,我修好了
  • 感谢它按我的意愿工作,我对如何在我的用例中使用模板感到困惑
  • @Orcepee 请记住这一点:如果您在模板化函数中调用方法/操作符,则模板参数必须具有该方法/操作符的定义。在这种情况下,您想调用size,因此只要您的模板参数具有该方法,它就会起作用。如果你用int myarray[20] 调用它,你会遇到编译错误。
  • 知道了!模板现在在我的脑海中越来越清晰
【解决方案3】:

T 是一个类型名称,所以在这里调用 .size() 并没有什么意义。

如果你想要一个类型的参数,你为什么要尝试使用模板? 你可以输入 cast your return。

试试

template <typename T>
int find_size(T a)
{
return (int) a.size();
}

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2021-05-10
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多