派生自std :: function vs手动创建仿函数

时间:2014-09-25 00:27:13

标签: functor std-function

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

过去几天我一直在阅读有关仿函数和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 ++初学者,我正试图绕过引用并移动语义,所以如果代码中存在明显的错误,或者编码风格很糟糕,我会道歉。

1 个答案:

答案 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});