C++:数组的函数模板专用化

C++: Function template specialization for array

本文关键字:专用 函数模板 数组 C++      更新时间:2023-10-16

我试图编写一个函数来对一系列数据执行任何操作。

//For stl containers
template<typename T>
void foo(T x){
    for(auto iter=x.begin();iter!=x.end();++iter)
        do_something(*iter);
}

这个函数是为操作STL容器而设计的,它还可以。但我想要C数组的另一个版本。所以我尝试了这个:

//For C-array
template<typename T,size_t N>
void foo(T x[N]){
    //blabla
}
//Error

我读过"数组的部分模板专门化"(以及其他几篇相关文章),但它是针对类模板的。我也知道,当你专门化一个函数模板时,你实际上是在重载它。无论如何,那篇文章中的解决方案不能在这里实现。

我有(或者可能没有)办法做到这一点吗?:-)谢谢你容忍我糟糕的英语,谢谢你的帮助。

您错过了对数组的引用:

template<typename T, size_t N>
void foo(T (&x)[N]){
    //blabla
}

顺便说一句,在您的情况下,您可以简单地在一般情况下使用(const)引用:

template<typename T>
void foo(T& x){
    using std::begin;
    using std::end;
    for (auto iter = begin(x); iter != end(x); ++iter)
        do_something(*iter);
}

甚至更好:

template<typename T>
void foo(T& x){
    for (auto&& e : x)
        do_something(x);
}

您可以通过引用传递它:

template<typename T,size_t N>
void foo(T (&x)[N]){
    //blabla
}

但是问题的真正解决方案是将一对迭代器传递给单个函数模板(适用于数组和标准容器):

template<typename Iterator>
void foo(Iterator begin, Iterator end){
    for(auto it = begin; it!=end; ++it)
        do_something(*it);
}
int main()
{
   int a[] = {1, 2, 3, 4, 5};
   foo(std::begin(a) , std::end(a));
   std::vector<int> v = {1, 2, 3, 4, 5};
   foo(std::begin(v) , std::end(v));
}