在C++中,如何编写函数,以便它可以处理任何数据类型

In C++, how to write a function so that it can work on any data type?

本文关键字:数据类型 处理 任何 函数 C++ 何编写      更新时间:2023-10-16

我正在使用以下资源学习C++STL: http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=standardTemplateLibrary

这里给出了以下反转数组的函数:

template<typename T> void reversearr(T *begin, T *end) { 
      // We should at first decrement 'end' 
      // But only for non-empty range 
      if(begin != end) 
      { 
           end--; 
           if(begin != end) { 
                while(true) { 
                     swap(*begin, *end); 
                     begin++; 
                     if(begin == end) { 
                          break; 
                     } 
                     end--; 
                     if(begin == end) { 
                          break; 
                     } 
                } 
           } 
      } 
 } 

它适用于系统定义的类型数组,例如:

int arr[]={1,2,3,4,5}
reversearr(arr,arr+5);

但它给出了以下编译器错误:

"Iterator02_ReverseIterators.cpp:39:32:错误:调用'reversearr(std::vector::iterator, std::vector::iterator)'没有匹配函数"

如果我使用此代码:

vector<int> v;
//Code to insert data in vector
reversearr(v.begin(),v.end());

如何编写类似的函数,以便它们也可以在迭代器上工作?

Welp,cppreference.com 再次为我们提供了一个完整的答案,也称为std::reverse

可能的实现:

template<class BidirIt>
void reverse(BidirIt first, BidirIt last)
{
    while ((first != last) && (first != --last)) {
        std::iter_swap(first++, last);
    }
}

其中BidirIt双向迭代器类型的概念。标准库容器的迭代器和原始指针都满足它,这就是它工作的原因。

在代码中,参数是T的指针。使用迭代器时,参数是指向迭代器的指针,因此它不起作用。

如果你想让它与迭代器一起工作,我认为你应该这样写:

template<typename T> 
void reversearr(T begin, T end)
{
   ...
}

这里有一个有趣的事实:

即使从参数中删除*,您的代码也适用于数组。

template<typename T> void reversearr(T begin, T end) { 

为什么?

因为在原始代码中,Tint的,而T*的函数参数是int*的。
在我修改后的代码中,Tint*,函数参数仍然int*

这个"版本"适用于迭代器 - 选择迭代器的语法和语义,以便您可以编写与指针或迭代器同样有效的泛型函数。

相关文章: