簡単なことです。しかし、私は最後の1時間を費やし、把握できませんでした。for_each()とlambda関数を使用してCスタイルの配列を出力するテンプレート関数
私は次のコードをコンパイルするとき:
#include <iostream>
#include <sort.h>
#define array_len(arr) (sizeof(arr)/sizeof (*arr))
using namespace std;
template<typename ITER>
void printIt_works(ITER b, ITER e) {
for_each(b, e, [](int it) { cout << it; }); // putting int explicitly would work
// but it's not generic
}
template<typename ITER>
void printIt_doesnt_work(ITER b, ITER e) {
for_each(b, e, [](ITER it) { cout << *it; });
}
int main() {
int a[] = {5, 2, 4, 6, 1, 3};
printIt_doesnt_work(a, a+array_len(a)); // how to make this work in a generic way.
//merge_sort(a, a+array_len(a));
selection_sort(a, 6);
insertion_sort_decending(a, 6);
insertion_sort(a, 6);
return 0;
}
を私が手にコンパイルエラーがある:
In file included from d:\mingw\bin\../lib/gcc/mingw32/4.5.2/include/c++/algorithm:63:0,
from D:\Workspaces\CodeBlocks\Test\main.cpp:4:
d:\mingw\bin\../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_algo.h: In function '_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = int*, _Funct = printIt_doesnt_work(ITER, ITER) [with ITER = int*]::<lambda(int*)>]':
D:\Workspaces\CodeBlocks\Test\main.cpp:17:5: instantiated from 'void printIt_doesnt_work(ITER, ITER) [with ITER = int*]'
D:\Workspaces\CodeBlocks\Test\main.cpp:23:42: instantiated from here
d:\mingw\bin\../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_algo.h:4185:2: error: invalid conversion from 'int' to 'int*'
d:\mingw\bin\../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_algo.h:4185:2: error: initializing argument 1 of 'printIt_doesnt_work(ITER, ITER) [with ITER = int*]::<lambda(int*)>'
D:\ mingwのの\ビン../ libに/ gccを/ MINGW32/4.5.2 /含めます/c++/bits/stl_algo.h:4185はfor_each
が3番目のパラメータとして渡された関数を呼び出す場合です:__f(*__first);
私のラムダ関数は期待通りに宣言されていますint*
ですが、for_each
のテンプレートインスタンスはint
で呼び出します。私はちょうどgeneric
の方法でそれを解決する方法をdonno。
が、それは一般的なではありません。
for_each(b, e, [](int it) { cout << it; });
:http://www.cplusplus.com/reference/std/iterator/iterator_traits/ – Anycorn
そのマクロを使用して配列の長さを取得しないでください。テンプレート size_t al(T(&)[N]){return N; }、あなたのマクロは、ポインタに適用されてコンパイルされますが、意図したように動作しないため。 –
PlasmaHH
@PlasmaHHありがとうございました。私は実際にそのようなものを探していました。:) – Kashyap