从具有迭代器参数的模板函数返回指针



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

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

我想使用完全演绎来制作函数,例如在调用函数时不指定返回类型。

如果可能的话,我还希望函数声明尽可能简单,没有任何库(如果需要,type_traitsstd::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. 您需要为 std::remove_reference<...>::type 添加typename,或者改用std::remove_reference_t(自 C++14 起(;

然后

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


其他建议:

  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;
    

最新更新