gpt4 book ai didi

c++ - 将不同大小的 C 数组传递给采用 2 个相同参数的模板函数

转载 作者:太空狗 更新时间:2023-10-29 21:37:33 26 4
gpt4 key购买 nike

我有一个模板化函数 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 << " ";
}
}

显然,以下代码失败并显示错误:没有匹配函数调用'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
}

但是,我不确定如何实现它。欢迎任何想法。谢谢!

直播demo基于 this answer .

最佳答案

你需要做一个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])使用此构建 block 重载。

如果您不喜欢工厂函数方法,您也可以编写一个模板化的(在 N 上)构造函数。

它可以代替任何标准容器使用,因为它支持 begin/end操作。它可以指代整个数组、数组的连续子集或任何标准容器的连续子序列。

关于c++ - 将不同大小的 C 数组传递给采用 2 个相同参数的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37370207/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com