gpt4 book ai didi

c++ - 从带有迭代器参数的模板函数返回指针

转载 作者:太空狗 更新时间:2023-10-29 21:13:41 25 4
gpt4 key购买 nike

最近我一直在学习动态内存分配。

出于练习目的,我尝试制作一个通用函数,它可以接受迭代器作为参数,然后从头到尾复制到一个动态分配的数组,然后返回一个指针。

例如,我想使用完全推导来创建函数,而不是在调用函数时指定返回类型。

如果可能的话,我还希望函数声明尽可能简单,没有任何库(除了 type_traits 中的 std::remove_reference 如果需要的话)。

以下代码无法编译。而且我知道从逻辑的角度来看代码是无用的。我只是想向您展示我的意图和我想要实现的目标...

#include <iostream>
#include <vector>
#include <type_traits>

template<typename T>
auto* returnPointer(T iter1, T iter2) -> std::remove_reference<decltype(*iter1)>::type
{
auto p = new std::remove_reference<decltype(*iter1)>::type [10];
auto p_help = p;

while(iter1 != iter2)
{
*p_help = *iter1;
p_help++;
iter1++;
}

return p;
}

int main ()
{
std::vector<int> v {0,1,2,3,4,5,6,7,8,9};
int *p = returnPointer(v.begin(), v.end());

for(int i = 0; i < 10; i++)
std::cout << p[i] << " ";

return 0;
}

我明白为什么它不能编译,我不知道如何让它按照我想象的方式工作......

非常感谢任何帮助! :)

最佳答案

  1. 当使用尾随返回类型声明时,你应该使用 auto直接地;
  2. 你需要添加typename对于 std::remove_reference<...>::type , 或使用 std::remove_reference_t (C++14 起)改为;

然后

auto  returnPointer(T iter1, T iter2) -> typename std::remove_reference<decltype(*iter1)>::type*
// ~ ~~~~~~~~ ~

LIVE


其他建议:

  1. 从 C++14 开始,您可以利用返回类型推导。就这样

    template<typename T>
    auto returnPointer(T iter1, T iter2)
    {
    auto p = new std::remove_reference_t<decltype(*iter1)> [10];
    ...
    return p; // return type will be deduced from p
    }
  2. 您可以使用 std::distance获取元素的数量,例如

    auto p = new std::remove_reference_t<decltype(*iter1)> [std::distance(iter1, iter2)];
  3. 别忘了 delete[]最后的指针,即

    delete[] p;

LIVE

关于c++ - 从带有迭代器参数的模板函数返回指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43313814/

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