从带有迭代器参数的模板函数返回指针
Returning a pointer from a template function with iterators parameters
最近在学习动态内存分配
出于练习目的,我尝试制作一个可以接受迭代器作为参数的通用函数,然后从头到尾复制到一个动态分配的数组,然后 return 是一个指针。
我想使用完全推导来制作函数,例如在调用函数时不指定 return 类型。
我还希望函数声明尽可能简单,没有任何库(如果需要,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;
}
我明白为什么它不能编译,我不知道如何让它按照我想象的方式工作...
非常感谢任何帮助! :)
- 当使用尾随 return 类型声明时,您应该直接使用
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 开始,您可以利用 return 类型推导。所以就
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;
最近在学习动态内存分配
出于练习目的,我尝试制作一个可以接受迭代器作为参数的通用函数,然后从头到尾复制到一个动态分配的数组,然后 return 是一个指针。
我想使用完全推导来制作函数,例如在调用函数时不指定 return 类型。
我还希望函数声明尽可能简单,没有任何库(如果需要,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;
}
我明白为什么它不能编译,我不知道如何让它按照我想象的方式工作...
非常感谢任何帮助! :)
- 当使用尾随 return 类型声明时,您应该直接使用
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 开始,您可以利用 return 类型推导。所以就
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;