考虑以下代码
typedef boost::variant<int, std::string> var_t;
// this interface class will be implemented in DLL
class producer
{
public:
virtual var_t produce() = 0;
};
// this class will be implemented by DLL user and
// pointer to object of this class will be passed to producer
// as callback interface
class produce_handler
{
public:
virtual void handle_produce(const var_t&) = 0;
};
众所周知,通过动态库边界传递STD对象通常是不安全的。那么boost类型,尤其是变体类型呢?
如果你能保证所有涉及的模块共享相同的工具链/选项(即ABI),应该没有真正的麻烦[1]。
无论如何:
同样,如果你知道"other"模块永远不会做任何事情,除了存储和传递一个引用给调用者,那么也不应该有问题。
一旦你开始通过值传递这些东西和/或在"外部"模块中间接引用/指针,我想说你需要非常确定你的平台支持这个并测试它。
[1]
在独立的问题之外,例如跨共享库边界抛出/捕获异常的能力;这不仅限于any
(或一般的RTTI)