使用for_each()AND lambda函数打印C样式数组的Template函数
Template function to print C-style array using for_each() AND lambda function
一件简单的事情。但我花了最后一个小时,搞不明白。
当我编译以下代码时:
#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:mingwbin../lib/gcc/mingw32/4.5.2/include/c++/algorithm:63:0,
from D:WorkspacesCodeBlocksTestmain.cpp:4:
d:mingwbin../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:WorkspacesCodeBlocksTestmain.cpp:17:5: instantiated from 'void printIt_doesnt_work(ITER, ITER) [with ITER = int*]'
D:WorkspacesCodeBlocksTestmain.cpp:23:42: instantiated from here
d:mingwbin../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_algo.h:4185:2: error: invalid conversion from 'int' to 'int*'
d:mingwbin../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\bin/lib/gcc/mingw32/4.5.2/include/c++/bits/sstl_algo.h:4185是for_each
调用作为第三个参数传递给它的函数的位置:__f(*__first);
我理解这个问题,我的lambda函数被声明为预期int*
,但for_each
的模板实例用int
调用它。我只是不知道如何用generic
的方法来解决它。
我当然可以通过使类型显式来解决问题,但这不是通用的:
for_each(b, e, [](int it) { cout << it; } );
一个选项是使用新的decltype
关键字来确定正在迭代的内容的类型:
template<typename ITER>
void printIt_works(ITER b, ITER e) {
for_each(b, e, [](decltype(*b) it) { cout << it; } );
}
这就生成了一个lambda,它的参数类型就是要迭代的内容的类型,这正是您想要的。
如果编译器上没有可用的decltype
,可以使用更大的iterator_traits
类型:
template<typename ITER>
void printIt_works(ITER b, ITER e) {
for_each(b, e, [](typename std::iterator_traits<ITER>::reference it) { cout << it; } );
}
但这真的很难看。
希望这能有所帮助!
使用lambda函数的替代方法是使用ostream_iterator
:
#include <iterator>
#include <algorithm>
template<typename Iterator>
void printIt(const Iterator& begin, const Iterator& end) {
typedef typename std::iterator_traits<Iterator>::value_type value_type;
std::copy(begin, end, std::ostream_iterator<value_type>(cout));
}
相关文章:
- 如何使用重新定义的打印函数打印Lua表?
- 从函数打印 CLI 帮助消息后,我应该如何干净地退出 C++ 程序?
- 使用成员函数打印对象
- 函数打印输出C 的错误
- 函数打印奇怪的值.C++
- Std::copy 和 std::ostream_iterator 使用重载函数打印值
- C++ 通过函数打印出 2D 数组
- 使用模板函数打印智能指针矢量
- C 是否可以使用宏从称呼的地方进行类函数打印
- infix/postfix/prefix程序.想要使用我的printresult()函数打印结果.需要帮助获得输出
- 从 Main 中的双指针函数打印出指针数组
- 如何使用递归函数打印节点树
- 重载函数打印
- 尝试通过函数打印时"Garbage" 2D 数组中的值
- 如何通过包含要打印的字符串的类函数打印异常
- 从函数C++打印出 2D 数组
- 如何通过wprintf函数打印uint32_t变量值
- 为什么我的函数打印地址而不是数组的内容
- 为什么这个函数打印的是x而不是1
- 将函数打印到输出文件