2011-05-04 99 views
3

我想开发2个类,节点连接,但我没有C++或C++模板的经验。C++模板问题

该节点包含连接列表,并且连接包含2个节点。 所以我假设一个节点有一个模板参数,它指定列表中的哪种连接类型,并且连接有一个模板参数,用于指定它包含的节点类型。

如何在C++中强制执行该节点包含通用类型的连接,但这些连接包含类节点的节点? Connection类的相同问题。我想为节点类型设置一个通用参数,但这些通用节点必须包含一个带有Connection类连接的列表。

我已经试过几件事情,这是我的时刻:

template <template <template <class Conn> class Node> class Conn> 
class Node { 
}; 

有人能帮助我吗?

由于提前,

杰夫

+3

为什么要使用模板显示侵扰? – 2011-05-04 15:14:19

回答

3

假设你想不同类型的节点,但连接只不过是两个节点(即,你不需要做任何的之间的联系在连接专业化),那么你可以这样做:

template <class Node> 
class Connection 
{ 
    Node& node1; 
    Node& node2; 
}; 

template <class Node> 
class NodeBase 
{ 
    std::list< Connection<Node> > connections; 
}; 

// example concrete node 
class MassNode : public NodeBase<MassNode> 
{ 
    // stuff that makes a mass node more than just a node. 
} 

这是一个叫做curiously recurring template pattern模式。

还有其他攻击方法 - 你可以给你的具体问题域更多的信息?

编辑到与非侵入性技术

namespace intrusive 
{ 
    template <class node> 
    class directedConnection 
    { 
     node& From; 
     node& To; 
    }; 

    template <class node> 
    class directedGraphNode 
    { 
    private: 
     std::set< directedConnection<node>* > OutgoingConnections; 
     std::set< directedConnection<node>* > IncomingConnections; 
    }; 

    // sample concrete class. Note that it is a graph node AND it contains the node data. 
    class bayesianNetworkNode : public directedGraphNode<bayesianNetworkNode> 
    { 
    public: 
     double Probabilities[16]; 
    }; 

    bayesianNetworkNode B1, B2, B3; 
} 

namespace non_intrusive 
{ 
    template <class T> 
    class undirectedGraphNode; 

    template <class T> 
    class undirectedConnection 
    { 
     undirectedGraphNode<typename T>& Node1; 
     undirectedGraphNode<typename T>& Node2; 
    }; 

    template <class T> 
    class undirectedGraphNode 
    { 
    private: 
     std::set< undirectedConnection<T>* > Connections; 
     T Value; 
    public: 
     T& operator *() { return Value; } 
     T* operator ->() { return &Value; } 
    }; 

    // sample concrete class. Note that this class contains the node data, but is NOT actually a graph node itself. 
    // It is "pointed to" by a node in the same way that an STL iterator "points to" a collection item. 
    class markovNetworkNode 
    { 
    public: 
     std::set<formula> Formulae; 
    }; 

    undirectedGraphNode<markovNetworkNode> M1, M2, M3; 
} 
+0

谢谢!我想模拟贝叶斯和马尔可夫网络。所以一个具体节点可以是一个随机变量,例如一个连接可以是直接的也可以是无向的。所以我也需要对Connection类进行专门化......我该如何解决这个问题? – hermi 2011-05-04 15:53:06

+0

在我的出路上 - 稍后会用两种技术回复 - 一种侵入性(如上面的代码),另一种则不会。 – 2011-05-04 17:06:38

+0

+1好的答案。干净,简单,做这份工作。也完全通用。 – ralphtheninja 2011-05-04 20:07:09