从std::function派生与手动创建函子



我正在尝试创建一个带有状态的可调用元素队列,以便存储可调用元素(带有一个指示何时调用的整数),然后稍后调用它(在检查其中存储的整数后)。

在过去的几天里,我一直在阅读关于函数和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});

最新更新