0

我正在设计一个分布式算法,我将功能分离如下:

class Peer {
public:
  void send(PeerId destination, ...) //send some data
}

class MyDistributedAlgorithm {
public:
  MyDistributedAlgorithm(Peer& self);
  doX(); //calls self.send()
}

以这种方式分离出来的价值是我可以将算法重用于 Peer 的不同实现(tcp/ip 套接字或线程等)

我意识到的一件事是 PeerId 可能取决于 Peer 的实现,但 MyDistributedAlgorithm 需要存储一个带有 PeerId 类型键的映射,因此它必须是一个具体类型。

我在 C++ 中相当缺乏经验,在 C 中,我对这个问题的解决方案是将 PeerId 定义为 void* 并将其转换为每个 Peer 实现所必需的。在 C++ 中有没有更好的方法来做到这一点?

4

1 回答 1

0

您可以制作PeerId经典的继承层次结构;因为没有一个实际的派生类可能有一个指针(因为它们确实是值),所以使用std::shared_ptr(或者 boost::shared_ptr,如果你没有 C++11)可能是安全的。

或者,您可以PeerId包装(共享)指针;为其提供必要的接口,并将其转发给指向的实现。

我在这里假设它PeerId是不可变的(赋值除外)。这似乎是标识符最有可能的情况,但如果不是,您将不得不考虑上述建议实现引用语义而不是期望值语义的事实。(对于不可变对象,您无法真正区分两者。)

于 2013-02-04T17:22:07.003 回答