最近、私は動的メモリ割り当てを学習しています。イテレータパラメータを使用してテンプレート関数からポインタを返す
練習のために、イテレータをパラメータとして受け入れ、次に動的に割り当てられた配列に最初から最後までコピーし、次にポインタを返す汎用関数を作成しようとしました。
たとえば、関数を呼び出すときに戻り値の型を指定せずに、完全控除を使用して関数を作成したいとします。
ライブラリのない関数宣言もできるだけシンプルにすることをお勧めします(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;
}
...
ご協力いただきありがとうございます。 :)
私は近くにいた!素晴らしい!もう一つの場所、つまり配列を割り当てていた場所で 'typename'を忘れてしまった。私はちょうどテストし、それは動作します!ありがとう! 'type'の後の' * 'の背後にある秘密は何ですか? – galaxyworks
@galaxyworksそれは簡単です、 'std :: remove_reference <...> :: type'は要素の型を返し、' * 'を加えることで要素へのポインタの型になります。あなたのコードは 'std :: vector'で動作し、 'std :: remove_reference <...> :: type'は' int'になり、 '*'を加えると 'int *'になります。 –
songyuanyao
私は今理解しています!答えと詳細な説明をありがとう! – galaxyworks