Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用迭代器参数从模板函数返回指针_C++_Templates_Pointers_Iterator_Dynamic Allocation - Fatal编程技术网

C++ 使用迭代器参数从模板函数返回指针

C++ 使用迭代器参数从模板函数返回指针,c++,templates,pointers,iterator,dynamic-allocation,C++,Templates,Pointers,Iterator,Dynamic Allocation,最近我一直在学习动态内存分配 出于实践目的,我尝试创建一个通用函数,该函数可以接受迭代器作为参数,然后从头到尾复制到动态分配的数组,然后返回指针 例如,我想使用完全推断来生成函数,而不需要在调用函数时指定返回类型 如果可能的话,我还希望函数声明尽可能简单,没有任何库(除了std::remove_referencefromtype_traits) 以下代码无法编译。我知道从逻辑上看,代码是无用的。我只是想告诉你我的意图和我想要实现的目标 #include <iostream> #inc

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

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

例如,我想使用完全推断来生成函数,而不需要在调用函数时指定返回类型

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

以下代码无法编译。我知道从逻辑上看,代码是无用的。我只是想告诉你我的意图和我想要实现的目标

#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;
}
#包括
#包括
#包括
模板
auto*returnPointer(T iter1,T iter2)->std::remove\u reference::type
{
auto p=新标准::删除_引用::类型[10];
自动p_帮助=p;
while(iter1!=iter2)
{
*p_help=*iter1;
p_help++;
iter1++;
}
返回p;
}
int main()
{
向量v{0,1,2,3,4,5,6,7,8,9};
int*p=returnPointer(v.begin(),v.end());
对于(int i=0;i<10;i++)
标准::cout
  • 使用尾部返回类型声明时,应直接使用
    auto
  • 您需要为
    std::remove\u reference::type
    添加
    typename
    ,或者改用
    std::remove\u reference\t
    (从C++14开始)
  • 然后

  • 最后不要忘了
    删除[]
    指针,即

    delete[] p;
    

  • 我差一点就成功了!太棒了!我又把
    typename
    忘在一个地方了,就是我分配数组的地方。我刚刚测试过,它可以工作!谢谢!你能解释一下
    *
    type
    之后的秘密吗?@galaxyworks很简单,
    std::remove\u reference::type
    将返回元素的类型,adding
    *
    使其成为指向元素的指针类型。对于使用
    std::vector
    的代码,
    std::remove\u reference::type
    将是
    int
    ,添加
    *
    使其成为
    int*
    。我现在明白了!感谢您的回答和详细解释!
    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
    }
    
    auto p = new std::remove_reference_t<decltype(*iter1)> [std::distance(iter1, iter2)];
    
    delete[] p;