【问题标题】:How to write a template function that takes an array and an int specifying array size如何编写一个模板函数,它接受一个数组和一个指定数组大小的 int
【发布时间】:2016-01-19 00:20:01
【问题描述】:

在一次大学练习中,我被要求编写一个模板函数“print();”,它有两个参数,1:一个泛型类型的数组,2:一个指定数组大小的 int。然后该函数应将数组中的每个项目打印到控制台。我在函数参数方面遇到了一些问题。我目前拥有的代码是:

   template <typename Type>
   Type print (Type a, Type b)
    {
        Type items;
        Type array;
        a = array;
        b = items;

        for (int i = 0; i < items; i++) {
        std::cout << std::endl << "The element of the index " << i << " is " << array << std::endl;
        std::cout << std::endl;
    }

在 main() 中:

    print(Array[], 10);

显然,将 Array 作为参数并没有返回值,所以我不确定还能做什么。有什么想法吗?

【问题讨论】:

  • 是否可以传递指针(在数组到指针衰减之后)还是要通过引用获取数组?
  • (在第一种情况下你也可以传递非静态数组)
  • 抱歉,我不确定,我在这个问题中只写了教科书问我的内容。

标签: c++ arrays function template-function


【解决方案1】:

如果你想通过引用传递数组,你可以

template <typename T, size_t SIZE>
void print(const T(&array)[SIZE])
{
    for (size_t i = 0; i < SIZE; i++)
        std::cout << array[i] << " ";
}

然后,例如

int x[] = {1, 2, 3};
print(x);

LIVE

否则,你可以通过指针传递,注意数组会衰减为指针,你要保证SIZE被传递的正确性。

template <typename T>
void print(const T array[], size_t SIZE)
{
    for(size_t i = 0; i < SIZE; i++)
        std::cout << array[i] << " ";
}

然后,例如

int x[] = {1, 2, 3};
print(x, sizeof(x) / sizeof(int));

LIVE

【讨论】:

  • 请注意,传递 (pointer+size) 在 C++ 中是一种反模式。正是出于这个原因,GSL 定义了array_view
【解决方案2】:

正确的写法是

Live On Coliru

#include <iostream>

template <typename T, size_t size> void print(const T (&array)[size])
{
    for(size_t i = 0; i < size; ++i)
        std::cout << array[i] << " ";
}

int main() {
    int arr[] = { 1,2,3,4,99};

    print(arr);
}

打印

1 2 3 4 99

【讨论】:

  • 谢谢,当我在 main 中调用函数时,我究竟会输入什么作为参数?如果你能给我一个很棒的简单例子,我是 C++ 新手!
  • 需要更多范围。 Boost.Range indexed 如果需要索引 ;)
  • @willfo 添加了一个实时示例
猜你喜欢
  • 1970-01-01
  • 2021-02-09
  • 2021-03-07
  • 2022-12-04
  • 1970-01-01
  • 2022-08-02
  • 2019-12-05
  • 2021-03-30
  • 1970-01-01
相关资源
最近更新 更多