我正在尝试创建一个具有状态的可调用元素队列,因此我可以存储可调用元素(带有一个整数,指示何时应该调用它),然后稍后调用它(在检查其中存储的整数之后)。
过去几天我一直在阅读有关仿函数和std :: function模板的内容,我想知道以下两个选项中哪一个在内存和性能方面都更好(对于每个选项,哪个更好,如果不同)。
第一选项:
class UpdateFunction : public std::function<bool(unsigned long long int)> {
public:
unsigned long long int _intendedTime;
};
void main()
{
typedef std::deque<UpdateFunction> UpdateQueue;
UpdateQueue _updateQueue;
_updateQueue.push_back(UpdateFunction([](unsigned long long int time)->bool{return outsideFunction(time);}));
_updateQueue.back()._intendedTime = 10;
}
第二选项:
class UpdateFunction {
bool (*_fn)(unsigned long long int);
unsigned long long int _intendedTime;
UpdateFunction::UpdateFunction(bool (*fn)(unsigned long long int), unsigned long long int time)
: _fn(fn),
_intendedTime(time)
{
}
bool operator()(unsigned long long int time)
{
return _fn(time);
}
};
void main()
{
typedef std::deque<UpdateFunction> UpdateQueue;
UpdateQueue _updateQueue;
_updateQueue.push_back(UpdateFunction(outsideFunction, 10));
}
我从未见过任何人从std :: function派生的代码,所以我甚至不确定这会按预期工作。
接近我正在尝试做的答案是:https://stackoverflow.com/a/9050114/4076418,但我不需要变量参数(实际上,我只有一个签名,在上面的代码中) ,所以我认为从std :: function派生而不是包含它的实例可能会更好。说实话,我不知道std :: function有多慢或多快;我读过类型擦除的提及,但我仍在试图找出它是什么。
注意:我是一名C ++初学者,我正试图绕过引用并移动语义,所以如果代码中存在明显的错误,或者编码风格很糟糕,我会道歉。
答案 0 :(得分:2)
我会使用选项2的变体。这为function
提供了灵活性,但避免了子类化和需要处理构造函数的麻烦。
struct UpdateFunction {
std::function<bool(unsigned long long int)> fn;
unsigned long long int _intendedTime;
};
你甚至不需要特殊的构造函数,你可以说
queue.push_back(UpdateFunction{outsideFunction, 10});