多参数类模板和我的“顶点”类

如何解决多参数类模板和我的“顶点”类

| 我定义了一个\'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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?