首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++模板问题

C++模板问题
EN

Stack Overflow用户
提问于 2011-05-04 15:08:01
回答 1查看 236关注 0票数 3

我正在尝试开发两个类,Node和Connection,但我没有C++或C++模板方面的经验。

节点包含连接列表,连接包含2个节点。因此,我假设节点具有一个模板参数,该参数指定列表中的连接类型,而连接具有一个模板参数,该参数指定它包含的节点类型。

如何在C++中强制该节点包含泛型类型的连接,但这些连接包含类节点的节点?连接类的相同问题。我想要一个节点类型的泛型参数,但是这些泛型节点必须包含一个连接类连接的列表。

我已经尝试过几件事,这就是我目前所拥有的:

代码语言:javascript
复制
template <template <template <class Conn> class Node> class Conn>
class Node {
};

有人能帮我吗?

提前谢谢你,

杰夫

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-04 15:23:45

假设您需要不同类型的节点,但连接只不过是两个节点之间的链接(也就是说,您不需要对连接进行任何专门化),那么您可以这样做:

代码语言:javascript
复制
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.
}

这是一个叫做奇怪的是反复出现的模板模式的模式。

有其他的方法来攻击这个-你能提供更多关于你的特定问题域的信息吗?

编辑以显示侵入性和非侵入性技术

代码语言:javascript
复制
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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5885598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档