如何解决多参数类模板和我的“顶点”类
| 我定义了一个\'vertex \'类,将其组合在一起便形成了一个图形。 这些顶点在一端接收输入,而在另一端产生输出(这两个端点都可以具有该顶点类的其他实例的0、1或更多“ \ subscriptions”) 传入和传出数据的类型彼此独立,并被指定为模板参数,因为这些顶点必须对各种输入/输出类型进行操作。 因此,在代码中它变成:template<class incomingDataType,class OutgoingDataType>
class Vertex {...}
在发送接收到的数据之前,顶点可以应用过滤器功能对数据进行转换/过滤,然后再将其发送回列表订户。
此函数被声明为纯虚拟函数,因为其功能取决于从该虚拟顶点基类继承的专业化类的类型。
这意味着过滤器被声明为:
OutgoingDataType filter(incomingDataType data) = 0;
当然,我想将多个顶点彼此链接在一起。
以最简单的形式考虑此链接,其中每个顶点的输入和输出正好连接到另一个顶点的输入/输出:
(ClassX)vertex1(int)->(int)vertex2(std :: string)->(std :: string)vertex3(OtherClassOrType)-> ...
考虑到这一点,对于给定的示例,问题陈述如下:
vertex2必须将vertex1列为订户,并自己订阅vertex3。
为了跟踪所有这些订阅,一个顶点会保留一组指向其所有发布者和订阅者的指针:
template<class incomingDataType,class OutgoingDataType>
class Vertex {
....
bool subscribe(Vertex<OutgoingDataType,__DontCareType__>* subscriber);
OutgoingDataType filter(incomingDataType data) = 0;
....
//set of \'outgoing vertices\' - whom we provide with data
std::set< Vertex<OutgoingDataType,__DontCareType__>* >subscribers_;
//set of \'incomming vertices\' - providing us with data
std::set< Vertex<__DontCareType__,incomingDataType>* >publishers_;
}
订阅我们的顶点需要将其传入数据类型与我们的传出数据类型进行匹配,但是我们不关心订户的传出数据类型,因为它与我们无关。我们的发布者的传入数据类型也是如此。
不幸的是,我似乎无法弄清楚该如何指定。我已经用函数模板而不是类模板来处理boost :: any(不会编译),void指针(不会编译),虚假指针(由于虚拟过滤器功能而无法工作)。 。但是我想不起作品。
简而言之,我正在寻找一种将\'DontCareType \'类型作为模板参数的方式(如果可能的话),这基本上就是说“我标记为\”的模板参数的方式。我不在乎可以是任何类型,因为无论如何我都不会使用它的数据”
作为获得可行解决方案的最后手段,我还考虑使用一种“ VertexData”类型的选项,该类型必须是顶点中使用的任何传入或传出数据类型的基类。这对您有帮助吗?
当然也欢迎其他任何使此可行的建议。
解决方法
您要为此使用运行时继承。
template<typename T> struct InputVertex { ... };
template<typename T> struct OutputVertex { ... };
template<typename Incoming,typename Outgoing> struct Vertex
: public InputVertex<Incoming>,public OutputVertex<Outgoing> {
std::set<InputVertex<Outgoing>*> outgoings;
public:
void RegisterFilter(InputVertex<Outgoing>* ptr) {
outgoings.insert(ptr);
}
void RemoveFilter(InputVertex<Outgoing>* ptr) {
outgoings.erase(ptr);
}
void Process(const std::vector<Incoming>& ref) {
std::vector<Outgoing> output;
// Transform
for(auto ref : outgoings) {
outgoings->Process(output);
}
}
};
在这种情况下,传入和传出的接口显然是分开的,这使得独立处理两者更加容易。请原谅我对C ++ 0x基于范围的使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。