2010-04-19 38 views
4

两个客户端相互通信上的消息层如何浇铸C++智能指针上下

在消息主体中,我需要包括指向任何数据类型

从客户端A的场的顶,我将该字段作为shared_ptr<TYPEA>发送到消息层。 我在消息层中将此字段定义为shared_ptr<void>。 但是我怎样才能将这个字段转换回客户端B中的shared_ptr<TYPEA>

或者我应该在消息层中定义shared_ptr<void>作为别的东西吗?

感谢

+0

客户端是否存在于不同的进程中,可能但不一定在不同的主机上? – outis 2010-04-19 23:34:46

+0

这两个客户端处于相同的过程。 stackoverflow不正确显示我的问题。它是shared_ptr < TYPEA > to shared_ptr < void >然后再回到shared_ptr < TYPEA >。 似乎static_ptr_cast,dynamic_ptr_cast不能将void转换为TYPEA – jordan 2010-04-20 14:22:25

+0

实际上,我当前的实现TYPEA是一个std :: vector,但它可能是std :: string等或任何用户定义的类。定义一个通用的基类可能是不可能的。 – jordan 2010-04-20 14:28:39

回答

2

如果你使用boost :: shared_ptr,那么你可以使用各种XXX_ptr_cast <>()函数(static_ptr_cast,dynamic_ptr_cast ...)。

如果您使用的是MSVC 2010版本,我一直无法找到这些功能的实现。它们可能不是标准的一部分。

+1

MSVC2010版本是dynamic_pointer_cast:http://msdn.microsoft.com/en-us/library/bb982967.aspx – bsruth 2010-04-20 14:36:05

+0

cast shared_ptr < void > var with std :: tr1 :: static_pointer_cast < TYPEA >(var)does not work。我的错。 将TYPEA转换为无效,然后将static_cast转换为TYPEA等同于reinterpret_cast – jordan 2010-04-20 15:21:51

0

如果您计划在客户端之间通过所有可能的数据类型,从一些常见的基类继承,你可以简单地包括在基类,它表示该派生类型的当前实例是一个标志变量。在客户端之间传递基类指针,然后使用dynamic_cast将基指针向下转换为适当的派生类型。

2

如果shared_ptrs &指向的数据不保存在存储器中常见到两个客户端(例如,客户端在不同的进程中运行,并且该数据不是在共享存储器),从一个客户机指针不会对另一方有效。您需要构建指向数据的表示形式并将其传输。接收器在消息传递层中构造自己的数据副本,并将shared_ptr传递给客户端。