我想通过模板实现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