2017-04-10 21 views
3

最近、私は動的メモリ割り当てを学習しています。イテレータパラメータを使用してテンプレート関数からポインタを返す

練習のために、イテレータをパラメータとして受け入れ、次に動的に割り当てられた配列に最初から最後までコピーし、次にポインタを返す汎用関数を作成しようとしました。

たとえば、関数を呼び出すときに戻り値の型を指定せずに、完全控除を使用して関数を作成したいとします。

ライブラリのない関数宣言もできるだけシンプルにすることをお勧めします(std::remove_referenceからtype_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; 
} 

...

ご協力いただきありがとうございます。 :)

答えて

3
  1. 末尾の戻り値の型宣言を使用する場合は、autoを直接使用する必要があります。
  2. std::remove_reference<...>::typetypenameを追加するか、代わりにstd::remove_reference_t(C++ 14以降)を使用する必要があります。

その後

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

LIVE


その他の提案:C++ 14あなたは戻り値の型推論を利用することができますので、

  1. 。これだけ

    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. あなたはすなわち、delete[]に最後にポインタを忘れてはいけない

    auto p = new std::remove_reference_t<decltype(*iter1)> [std::distance(iter1, iter2)]; 
    
  3. のように、要素の数を取得するために

    delete[] p; 
    
std::distanceを使用することができます

LIVE

+0

私は近くにいた!素晴らしい!もう一つの場所、つまり配列を割り当てていた場所で 'typename'を忘れてしまった。私はちょうどテストし、それは動作します!ありがとう! 'type'の後の' * 'の背後にある秘密は何ですか? – galaxyworks

+1

@galaxyworksそれは簡単です、 'std :: remove_reference <...> :: type'は要素の型を返し、' * 'を加えることで要素へのポインタの型になります。あなたのコードは 'std :: vector 'で動作し、 'std :: remove_reference <...> :: type'は' int'になり、 '*'を加えると 'int *'になります。 – songyuanyao

+0

私は今理解しています!答えと詳細な説明をありがとう! – galaxyworks

関連する問題