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