我试着编写一个函数来对一系列数据做任何事情。
//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
我读过"Partial template specialization for arrays"(以及其他几篇相关文章),但这是针对课程模板的。而且我也知道,当你专注于一个功能模板时,你实际上正在超载它。无论如何,该帖子中的解决方案无法在此实现。
我可以这样做(或者没有)吗? :-)感谢你容忍我糟糕的英语和你的帮助。
答案 0 :(得分:5)
你错过了对数组的引用:
template<typename T, size_t N>
void foo(T (&x)[N]){
//blabla
}
BTW,在您的情况下,您可以在通用案例中使用(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);
}
答案 1 :(得分:5)
您可以通过引用传递它:
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));
}