gpt4 book ai didi

c++ - 用于递归模板评估的类型转换数组类型

转载 作者:行者123 更新时间:2023-11-28 00:07:49 24 4
gpt4 key购买 nike

我很想包括一个最小的例子,但由于我的问题的性质,我不能提供一个。

我将我的问题简化为无法对数组进行类型转换。这是一个代码片段,显示了我想写的内容:

template <size_t N>
size_t arrLen(int(&data)[N])
{
return N;
}

int main(int argc, char** argv)
{
int arr[] = { 1, 2, 3, 4, 5, 6 };

size_t working = arrLen(arr);

int * p = &arr[1];
size_t len = 3;

size_t len_is_not_a_constant_value = arrLen(*(int(*)[len])p);
}

我的 Playground 算法是在一维数组中找到任何峰,其中峰被定义为大于或等于峰的邻居。算法本身对我来说并不太重要。以下代码注释掉了我想包含但不能包含的行,因为它不会编译。如果没有这些行,算法是不正确的。

template <size_t N>
int getpeak1D_templated(int(&data)[N])
{
size_t offset = N / 2;

if (data[offset] < data[offset - 1])
{
int * p = data;
size_t len = offset;
//return getpeak1D_templated(*(int(*)[len])p);
return 0;
}
else if (data[offset] < data[offset + 1])
{
int * p = &data[offset];
size_t len = N - offset;
//return offset + getpeak1D_templated(*(int(*)[len])p);
return 0;
}
else
{
return offset;
}
}

int getpeak1D_templated(int(&data)[1])
{
return 0;
}

int getpeak1D_templated(int(&data)[2])
{
if(data[0] < data[1]) return 1;
return 0;
}

这是非模板化版本。这将编译并且应该是正确的。

int getpeak1D(int * data, size_t N)
{
size_t offset = N / 2;

size_t offset_m1 = offset - 1;
size_t offset_p1 = offset + 1;

if (N >= offset_m1 && data[offset] < data[offset_m1])
{
return getpeak1D(data, offset);
}
else if (N >= offset_p1 && data[offset] < data[offset_p1])
{
return offset + getpeak1D(data + offset, N - offset);
}
else
{
return offset;
}
}

我明白为什么这个 *(int(*)[len])p 是无效的。

感觉好像缺少了什么。此递归终止,我将能够手动写出所有特化(对于合理的起始数组大小)。我假设我在这里做错了什么。不知何故,这种递归应该可以使用模板。

是否有我缺少的数组转换版本?

我错过了什么完全不同的东西吗?

编辑:我实际上可以明白为什么这是无效的。我的观点是 N 是常量,所有操作都定义得很好,可以在编译时解决。因此对于大小为 N 的数组,可以展开递归的所有分支。我正在寻找到达那里的方法。类型转换不正确,永远不会正确。

最佳答案

您不能将注释行中的 len 替换为 N/2 和 N-N/2。像这样:

template <size_t N>
int getpeak1D_templated(int(&data)[N])
{
size_t ret = 0;
size_t offset = N / 2;
if (data[offset] < data[offset - 1])
{
int * p = data;
ret = getpeak1D_templated(*(int(*)[N/2])p);
}
else if (data[offset] < data[offset + 1])
{
int * p = &data[offset];
ret = offset + getpeak1D_templated(*(int(*)[N - N/2])p);
}
else
{
ret = offset;
}
return ret;
}

int getpeak1D_templated(int(&data)[1])
{
return 0;
}

int getpeak1D_templated(int(&data)[2])
{
if(data[0] < data[1]) return 1;
return 0;
}

关于c++ - 用于递归模板评估的类型转换数组类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34538914/

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