使用不同的模板参数包装模板类

时间:2013-11-21 15:47:08

标签: c++ delegates threadpool

我想写一个线程池,在线程池中我有任务队列。 每个任务都是具有不同结果类型的委托。

我想在线程池队列中插入此委托,但因为每个委托具有不同的模板参数,所以这是不可能的。

我想要一种方法,用不同的模板参数包装这个代理,这样我就可以将它们插入队列中。

将获得任务的线程池的功能:

Queue<Delegate<?()>> workQueue; // Can't use specific type

template<typename R>
Task<R> doWork(Delegate<R(void)> del)
{
    workQueue.pushBack(del); // Can't do this
}

或类似这样的伪代码:

Array{ Delegate<void(void)>, Delegate<int(void)>, Delegate<MyClass(void)> }

2 个答案:

答案 0 :(得分:2)

尝试使用Boost Any  升压::任何

答案 1 :(得分:0)

我找到了解决方案:

class FunctionWrapper
{
private:

protected:
    class ImpBase
    {
    public:
        virtual ~ImpBase() {}
        virtual void call() abstract;
    };

    template<typename F>
    class Imp : public ImpBase
    {
    public:
        typename F FunctionType;

        FunctionType mFunc;

        Imp(FunctionType&& pFunc) : mFunc(std::move(pFunc)) {}
        ~Imp() {}

        void call() override { mFunc(); }
    };

    std::unique_ptr<ImpBase> mPtr;

public:
    FunctionWrapper() = default;
    FunctionWrapper(const FunctionWrapper&) = delete;
    template<typename F>
    FunctionWrapper(F&& pFunc) : mPtr(new Imp<F>(std::move(pFunc))) {}

    FunctionWrapper& operator =(const FunctionWrapper&) = delete;
    FunctionWrapper& operator =(FunctionWrapper&& pOther) { mPtr = std::move(pOther.mPtr); }

    void operator ()() { mPtr->call(); }
};