【问题标题】:Returning a pointer from a template function with iterators parameters从带有迭代器参数的模板函数返回指针
【发布时间】:2017-04-10 01:35:41
【问题描述】:

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

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

我想用完全推导来做函数,例如调用函数时不指定返回类型。

如果可能的话,我还希望函数声明尽可能简单,不要使用任何库(std::remove_referencetype_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;
}

我明白为什么它不能编译,我不知道如何让它按照我想象的方式工作......

非常感谢任何帮助! :)

【问题讨论】:

    标签: c++ templates pointers iterator dynamic-allocation


    【解决方案1】:
    1. 使用尾随返回类型声明时,应直接使用auto
    2. 您需要为std::remove_reference&lt;...&gt;::type 添加typename,或者改用std::remove_reference_t(C++14 起);

    然后

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

    LIVE


    其他建议:

    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;
      

    LIVE

    【讨论】:

    • 我很接近!惊人的!我在另一个地方忘记了typename,也就是我分配数组的地方。我刚刚测试,它的工作原理!谢谢!你能解释一下type之后*背后的秘密吗?
    • @galaxyworks 很简单,std::remove_reference&lt;...&gt;::type 将返回元素的类型,添加* 使其成为指向元素的指针的类型。对于你的代码,std::vector&lt;int&gt; 工作,std::remove_reference&lt;...&gt;::type 将是 int,添加 * 使其成为 int*
    • 我现在明白了!感谢您的回答和详细解释!
    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2015-01-20
    • 1970-01-01
    • 2014-04-14
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多