在C++中,如何编写函数,以便它可以处理任何数据类型
In C++, how to write a function so that it can work on any data type?
我正在使用以下资源学习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) {
为什么?
因为在原始代码中,T
是int
的,而T*
的函数参数是int*
的。
在我修改后的代码中,T
是int*
,函数参数仍然int*
。
这个"版本"适用于迭代器 - 选择迭代器的语法和语义,以便您可以编写与指针或迭代器同样有效的泛型函数。
相关文章:
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何处理具有无效数据类型的异常
- 如何在没有性能命中的情况下抽象SIMD代码来处理不同的数据类型
- 将 32 位旧代码移植到 64 位时如何处理更改数据类型大小?
- 当数字可能超出C++中特定数据类型的范围时如何处理异常?
- 窗口后台处理程序究竟如何确定它将发送到打印处理器的数据类型?
- 解析一般CSV读取功能时,如何处理不同的数据类型?(不明确指定它们)
- 如何使用 C++ 驱动程序在 MongoDB 中使用 UserException 处理数据类型错误
- 模板函数,用于处理 C++ 中的不同数组维度和数据类型
- 我该怎么做 throw 来处理 C++ 中的错误数据类型
- 有必要在为Windows和Linux编写的程序中处理长数据类型吗
- 在C++中,如何编写函数,以便它可以处理任何数据类型
- c++正在寻找一种合理的方法来处理SqlServer数据类型datetime
- GCC编译器是否可以处理比long / long / int更大的其他数据类型?
- 读取数据库/文件中的不同数据类型(c++中的文件处理)
- 是否可以在VTK中使用(polyData)编写器来处理来自其他库的数据类型?
- 在托管c#应用程序的非托管c++ Dll调用中,如何处理数据类型之间的冲突
- 可以原子方式获取和处理的最大数据类型
- 是否有可能像处理内置数据类型那样处理class_inst = some_func(class_inst) ?