在下面的代码中,我想摆脱采用各种类型函数指针的奇怪构造函数,以及必须保存的参数列表(以及保存所有这些所需的所有成员变量),并且而是使用闭包来完成所有这些工作,给 Event 留下一个类似于Closure closure;
. 有没有办法在 C++0x 中使用闭包来做到这一点?
#include <iostream>
#include <list>
#include <functional>
#include <algorithm>
class Event
{
std::function<double(double, double)> func1;
bool func1Defined;
double double1, double2;
std::function<double(int, int, int)> func2;
bool func2Defined;
int int1, int2, int3;
public:
void setFalse()
{
func1Defined = false;
func2Defined = false;
}
Event(std::function<double(double, double)> func, double double1, double double2)
{
setFalse();
func1 = func;
func1Defined = true;
this->double1 = double1;
this->double2 = double2;
}
Event(std::function<double(int, int, int)> func, int int1, int int2, int int3)
{
setFalse();
func2 = func;
func2Defined = true;
this->int1 = int1;
this->int2 = int2;
this->int3 = int3;
}
void run()
{
double ret = 0;
if (func1Defined) ret = func1(double1, double2);
else if (func2Defined) ret = func2(int1, int2, int3);
/* do something with ret */
std::cout << ret << "\n";
}
};
double twoDoubleParam(double a, double b)
{
return a + b;
}
double threeIntParam(int a, int b, int c)
{
return (a + b) / c;
}
int main(int argc, char* argv[])
{
std::list<Event> events;
events.push_back(Event(*twoDoubleParam, 1.0, 3.5));
events.push_back(Event(*threeIntParam, 2, 4, 2));
std::for_each(events.begin(), events.end(), [&](Event event)
{
event.run();
});
int y;
std::cin >> y;
return 0;
}
不喜欢提升,但如果提升是最好/唯一简单的方法,我想知道如何。