我正在尝试创建一个带有状态的可调用元素队列,以便存储可调用元素(带有一个指示何时调用的整数),然后稍后调用它(在检查其中存储的整数后)。
在过去的几天里,我一直在阅读关于函数和std::函数模板的文章,我想知道以下两个选项中的哪一个在内存和性能方面都更好(如果不同,哪一个更好)。
第一种选择:
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::函数派生的代码,所以我甚至不确定这是否能像预期的那样工作。
一个接近我想要做的事情的答案是:https://stackoverflow.com/a/9050114/4076418,但我不需要变量参数(实际上,我只有一个签名,它在上面的代码中),所以我认为最好从std::function派生,而不是包含它的一个实例。老实说,我不知道std::函数有多慢或有多快;我读过关于类型擦除的文章,但我仍在努力弄清楚那是什么
注意:我是一个C++初学者,我正在努力理解引用和移动语义,所以如果代码中有明显的错误,或者编码风格很糟糕,我很抱歉。
我会选择选项2的变体。这为您提供了function
的灵活性,但避免了子类化和需要处理构造函数的麻烦。
struct UpdateFunction {
std::function<bool(unsigned long long int)> fn;
unsigned long long int _intendedTime;
};
你甚至不需要一个特殊的构造函数,你可以说
queue.push_back(UpdateFunction{outsideFunction, 10});