从具有迭代器参数的模板函数返回指针
Returning a pointer from a template function with iterators parameters
最近我一直在学习动态内存分配。
出于实践目的,我尝试制作一个通用函数,该函数可以接受迭代器作为参数,然后从头到尾复制到动态分配的数组,然后返回一个指针。
我想使用完全演绎来制作函数,例如在调用函数时不指定返回类型。
如果可能的话,我还希望函数声明尽可能简单,没有任何库(如果需要,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;
}
我明白为什么它不会编译,我不知道如何让它按照我想象的方式工作......
任何帮助都非常感谢! :)
- 使用尾随返回类型声明时,应直接使用
auto
; - 您需要为
std::remove_reference<...>::type
添加typename
,或者改用std::remove_reference_t
(自 C++14 起(;
然后
auto returnPointer(T iter1, T iter2) -> typename std::remove_reference<decltype(*iter1)>::type*
// ~ ~~~~~~~~ ~
住
其他建议:
从 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 }
您可以使用
std::distance
来获取元素的数量,例如auto p = new std::remove_reference_t<decltype(*iter1)> [std::distance(iter1, iter2)];
不要忘记最后
delete[]
指针,即delete[] p;
住
相关文章:
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量