C++:数组的函数模板专用化
C++: Function template specialization for array
我试图编写一个函数来对一系列数据执行任何操作。
//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));
}
相关文章:
- 具有常量引用参数的函数模板专用化
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 如何减少函数模板专用化?
- 专用于类型集的函数模板
- 类成员函数的函数模板专用化
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 将 c++ 类成员函数专用于模板类
- 类和成员函数模板专用化出错
- C++ 模板化基类的函数模板专用化
- 如何使专用函数模板成为某个类的朋友?
- 函数模板(它是类模板的成员)的显式专用化会产生"partial specialization is not allowed"错误,为什么?
- 函数模板中的显式模板专用化不起作用
- C++函数模板专用化和重载
- 无法专用化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
- 函数模板专用化生成链接错误
- 视图和跨步视图以及常量噩梦的函数模板专用化
- 函数模板重载 - 部分专用化
- 64 位 G++ 4.6.3 不会在专用函数模板中将长整型视为长整型,即使它们的大小相同。这是一个错误吗?
- 为什么我不能专用函数模板?
- 专用函数模板