我想通过模板实现Reciever / Publisher类。我不确定模板是否最适合此目的。但是,到目前为止,我得到的是:

#include <vector>
template <typename InType,typename OutType> class Pipe {
    public:
        void addListener(Pipe<OutType,???> l){
            listener.push_back(l);
        }
        virtual OutType process(InType)=0;
        void Fill(InType value){
            OutType outValue = process(value);
            for (int i=0;i<listener.size();i++){
                listener[i]->Fill(outValue);
            }
        }
    private:
        vector<Pipe<OutType,???>*> listener;
};

管道应允许具有不同OutType的侦听器。实际上,它不需要知道其侦听器的OutType,因为process()由侦听器调用。但是,我必须放置一个模板参数。我的方法有问题吗?还是有一种方法可以避免指定侦听器的OutType?

最佳答案

您可以使Pipe<InType, OutType>继承仅基于InType的通用基类:

template <typename InType>
class PipeBase {
public:
    virtual ~PipeBase() = default;
    virtual void Fill(InType value) = 0;
};

template <typename InType, typename OutType>
class Pipe : public PipeBase<InType> {
public:
    void addListener(PipeBase<OutType>* l){
        listener.push_back(l);
    }

    void Fill(InType value) { ... }

private:
    std::vector<PipeBase<OutType>*> listener;
};

Demo

10-08 08:23