将不同大小的 C 数组传递给模板化函数,其中包含 2 个相同的参数
Passing C-arrays of different sizes to templated function taking 2 identical parameters
我有一个模板化函数,如下所示func
它接受两个相同类型的参数(通常是两个相同类型但大小不同的 STL 容器)。我想让它适用于相同类型但大小不同的 C 数组。
template<class T>
void func(const T& a, const T& b) {
// some code like as follows
for(auto x : a) {
cout << x << " ";
}
cout << endl;
for(auto x : b) {
cout << x << " ";
}
}
显然,以下代码失败并error: no matching function for call to 'func(int [2], int [3])'
:
int a1[] = {1, 2};
int a2[] = {3, 4, 5};
func(a1, a2);
我无法更改函数签名,但可以重载它。我也想避免不必要的副本。我的尝试是编写一个重载,例如:
template<class T, size_t M, size_t N>
void func(const T (&a)[M], const T (&b)[N]) {
//somehow calling f<T>(const T&, const T&) without copying array elements
}
但是,我不确定如何实现它。欢迎任何想法。谢谢!
基于此答案的现场演示。
创建一个range<T*>
结构来包装你的数组,并为它定义begin()
和end()
函数。
它可以像
template<typename Iterator>
struct range { Iterator begin_, end_; };
template<typename T>
T begin(const range<T>& ar) { return ar.begin_; }
template<typename T>
T end(const range<T>& ar) { return ar.end_; }
template<typename T, size_t N>
range<T*> make_array_range(T (&array)[N])
{
using std::begin; using std::end;
return { begin(array), end(array) };
}
func( make_array_range(a1), make_array_range(a2) );
然后,您可以使用此构建基块轻松编写func(T[N], T[M])
重载。
如果您不喜欢工厂函数方法,您也可以编写模板化(在N
上)构造函数。
它可以代替任何标准容器,因为它支持begin
/end
操作。 它可以引用整个数组、数组的连续子集或任何标准容器的连续子序列。
以某种方式调用 f(const T&, const T&) 而不复制数组 元素
当然,这是行不通的,因为该模板函数返回两个相同类型的参数。
您需要做的是简单地将数组作为指针传递,并给出每个相应数组的大小。毕竟,关于数组,人们了解的第一件事是数组可以转换为指向数组第一个元素的指针。所以:
template<class T>
void func(const T *a, const T *b, size_t a_size, size_t b_size) {
// ...
}
现在,你的
template<class T, size_t M, size_t N>
void func(const T (&a)[M], const T (&b)[N])
应该能够简单地做这样的事情:
func(&a[0], &b[0], M, N);
然后,您"真实"func()
将知道每个数组的大小。
一种选择是使用转发引用:
template<class T, class U>
void func(T&& a, U&& b)
{
for(auto x : a)
cout << x << " ";
cout << endl;
for(auto x : b)
cout << x << " ";
}
然后,您可以传递其他容器或 C 样式数组。该参数是通过引用传递的,因此数组长度信息是可用的。
铌。请考虑在循环中使用auto&&
或auto const &
,以避免复制容器中的元素。
- 函数何时会在c++中包含stack_Unwind_Resume调用
- g++ 说函数不存在,即使包含正确的标头
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 如果基类包含双指针成员,则派生类的构造函数
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- 如果函数包含静态变量,为什么编译器不执行内联?
- 为什么宏__STL_FUNCTION_MPL_PARTIAL_ORDER应该将模板函数包含在std_pair.h中
- 如果函数包含在命名空间中,则"go to beginning of the function"不起作用 (C++)
- 创建自己所需的函数比为某个函数包含整个库更可取吗
- cv::meanShift函数包含什么
- 是否应将析构函数包含在使用自动存储的指针中
- 函数包含未命名参数
- 如何使我的resize函数包含前一个向量的元素?
- 将头文件中的特定函数包含到c++代码中
- c++类的析构函数包含ptr到对象的数组