【发布时间】:2012-11-20 08:45:05
【问题描述】:
我为std::bind 和std::queue 编写了以下包装器:
#include "Queue.h"
template<class T>
Queue<T>::Queue(T* input)
{
instance = input;
}
template<class T> template<typename... Args>
int Queue<T>::push(int (T::*func)(Args... args), Args... args)
{
queue.push(std::bind(func, instance, args...));
return queue.size();
}
template<class T>
int Queue<T>::pop()
{
if(!queue.empty())
{
queue.front()();
queue.pop();
return queue.size();
}
return 0;
}
template<class T>
bool Queue<T>::empty()
{
return queue.empty();
}
template<class T>
size_t Queue<T>::size()
{
return queue.size();
}
带有以下标题:
#ifndef QUEUE_H_
#define QUEUE_H_
#include <functional>
#include <queue>
template <class T>
class Queue
{
private:
std::queue<std::function<void()>> queue; /**< the messaging queue, appended to using enqueue(), popped from using dequeue() */
T* instance;
public:
Queue(T*);
template<typename... Args>
int enqueue(int (T::*f)(Args... args), Args... args);
int dequeue();
bool empty();
size_t size();
};
#endif
它允许我将绑定函数表达式添加到队列中并在之后弹出它们(queue->push<int>(&Object::jumpAround, 10); 和queue->pop())。问题是,我找不到一个通用的对象和函数指针,使我能够在没有<class T> 模板的情况下实现它。
我知道在这里使用模板可能是最安全和最好的方法,但由于实现此队列的代码设计,我需要摆脱它。有什么想法吗?
我想这一定是可能的,因为std::bind 的第一个参数可以是任何函数,第二个参数可以是任何对象。
【问题讨论】:
-
如果你使用
std::bind你有C++11,那你为什么不使用std::function呢? -
我唯一使用它的地方是在我的队列定义中:
std::queue<std::function<void()>> queue;。我不知道我还能/应该在哪里使用它...