在我的项目中,有两个组成部分:生产者和消费者。制作人负责处理一些信息并将结果提供给消费者。结果在函数对象的帮助下传递。
我正在使用一个函数来传递这些信息。您可以在下面的代码中看到它的外观。
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
class Data {
std::vector<int> vec;
public:
Data() {
cout << "Data()" << endl;
}
Data(const Data& rr) : vec(rr.vec) {
cout << "Data(Data&)" << endl;
}
~Data() {
cout << "~Data()" << endl;
}
Data(Data&& rr) : vec(move(rr.vec)) {
cout << "Data(Data&&)" << endl;
}
void get() {
}
};
class Producer {
public:
void process(function<void(Data)> f) {
Data data;
f(move(data));
}
void process2(void(&pf)(Data)) {
Data c;
pf(move(c));
}
};
void Consume(Data a) {
cout << "Consume(data)" << endl;
}
int main() {
{
cout << "use function() " << endl;
Producer p;
p.process([](Data a) {
cout << "Consume(data)" << endl;
});
}
{
cout << endl;
cout << "use function pointer" << endl;
Producer p;;
p.process2(Consume);
}
return 0;
}
它具有以下输出
use function()
Data()
Data(Data&&)
Data(Data&)
Data(Data&)
Consume(data)
~Data()
~Data()
~Data()
~Data()
use function pointer
Data()
Data(Data&&)
Consume(data)
~Data()
~Data()
使用函数对象时还有其他复制构造函数。
我做错了什么吗?是否有可能摆脱这些额外的构造函数?
提前谢谢。
我正在使用VC10 SP1。
答案 0 :(得分:0)
你有几个选择。
std::function
,您的非捕获lambda可转换为void(*)(Data)
std::function
,制作函数模板,编译器可以推导出lambda的隐藏类型。std::unique_ptr
可能更有效。