模板函数参数+operator()+for_each这个语法没看懂

Jenf_Mu 2012-12-15 10:33:40
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

template <typename elementType>
struct DisplayElement
{
void operator () (const elementType& element) const
{
cout << element << endl;
}
};

int main(int argc, char *argv[])
{
vector<int> vecIntegers;
vecIntegers.resize(10);

for_each ( vecIntegers.begin () // Start of range
, vecIntegers.end () // End of range
, DisplayElement <int>() ); // Unary function object


return 0;
}


大体意思知道是什么,但这句DisplayElement <int>(),没看懂,这里传入了一个函数。但如果这个函数不是operator的,是个普通函数,怎么写呢?

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

template <typename elementType>
struct test2
{
void display(const elementType& element) const
{
cout << element << endl;
}
};
int main(int argc, char *argv[])
{
vector<int> vecIntegers;
vecIntegers.resize(10);

for_each ( vecIntegers.begin () // Start of range
, vecIntegers.end () // End of range
, &test2 <int>::display ); // 报错

return 0;
}
...全文
209 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jenf_Mu 2012-12-15
  • 打赏
  • 举报
回复
引用 7 楼 oniisama 的回复:
这个问题在c++11下可以毫无压力地解决,但刚刚我试了试旧标准的bind1st和mem_fum时发现了一个有趣的新问题 C/C++ code?1234test2<int> a; for_each ( vecIntegers.begin () // Start of range , vecIntegers.end () // End……
大神终于出现了
oniisama 2012-12-15
  • 打赏
  • 举报
回复
这个问题在c++11下可以毫无压力地解决,但刚刚我试了试旧标准的bind1st和mem_fum时发现了一个有趣的新问题
test2<int> a;
    for_each ( vecIntegers.begin ()    // Start of range
        , vecIntegers.end ()        // End of range
		, bind1st(mem_fun(&test2<int>::display),&a)); // Unary function object
我把lz的代码改成这样,发现无法编译,说我重复声明或定义,但是错误的地方竟然指向bind1st的定义。后来在网上查了一下,原来成员函数的参数是const引用的话,就会出现这个问题,看来这个问题在旧标准上貌似无解,所以还是建议使用新标准的函数,附上c++11的解决办法
for_each ( vecIntegers.begin ()    // Start of range
        , vecIntegers.end ()        // End of range
		, bind(mem_fn(&test2<int>::display),test2<int>(),placeholders::_1)); // Unary function object
Jenf_Mu 2012-12-15
  • 打赏
  • 举报
回复
引用 5 楼 lile1234_show 的回复:
DisplayElement <int>() , 模版类型是int 。 你声明的是vector<int>。 你要写普通函数 void display(const int& element) const // 前提你的vector<类型是int> { cout << element << endl; } for_each ……
这里直接写个display,连个类名都没有,那能识别?我要是A类里有个display,B类里有个display,怎么办?
lee_鹿游原 2012-12-15
  • 打赏
  • 举报
回复
DisplayElement <int>() , 模版类型是int 。 你声明的是vector<int>。 你要写普通函数 void display(const int& element) const // 前提你的vector<类型是int> { cout << element << endl; } for_each ( vecIntegers.begin () // Start of range , vecIntegers.end () // End of range , display ); for_each 第一个参数和第二个参数指定范围之中的每一个元素 都会带入到第三个参数指定的函数中去。
Binzo 2012-12-15
  • 打赏
  • 举报
回复
有关函数对象
Jenf_Mu 2012-12-15
  • 打赏
  • 举报
回复
引用 2 楼 oN5GrzoN 的回复:
C/C++ code?12345678template <typename elementType>struct test2{ static void display(const elementType& element) { cout << element << endl; }};
这只是权宜之计,如果这个函数里允许操作类成员变量呢?
struct DisplayElement
{
	int a;
	void operator () (const elementType& element) const
	{
		cout << a<<":"<<element << endl;
	}
};
人家这个也是可以编译通过的。
oN5GrzoN 2012-12-15
  • 打赏
  • 举报
回复
template <typename elementType>
struct test2
{
	static void display(const elementType& element)
	{
		cout << element << endl;
	}
};
oN5GrzoN 2012-12-15
  • 打赏
  • 举报
回复
template <typename elementType>
struct test2
{
	static void display(const elementType& element)
	{
		cout << element << endl;
	}
};

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧