假设你想不同类型的节点,但连接只不过是两个节点(即,你不需要做任何的之间的联系在连接专业化),那么你可以这样做:
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;
}
为什么要使用模板显示侵扰? – 2011-05-04 15:14:19