隐藏typedef实现

时间:2011-12-08 09:16:04

标签: c++ boost c++11

我有这个 typedef 依赖于另一个库中的类型(在这种情况下是boost):

#include <boost/any.hpp>

typedef boost::any& myAnyType;

我会在我的所有程序中使用定义 myAnyType 隐藏其真实性并保持与Boost库的独立性(客户端不需要安装Boost来使用myAnyType)

有可能吗?

3 个答案:

答案 0 :(得分:2)

  

客户端无需安装Boost即可使用myAnyType

肯定会这样。是的,您将此定义为对any的引用,因此它们可以声明一个“myAnyType”变量,而不包含该类型的定义。但他们无法做任何事情。实际上,像myAnyType var;这样简单的事情失败了,因为它是一个参考。

他们甚至无法调用以myAnyType作为参数的函数,因为它们无法声明myAnyType对象。即使const myAnyType也行不通,因为C ++必须创建一个临时的。并且它无法从未定义的类型创建临时。

您的图书馆并非独立于Boost;它依赖于在Boost上,并将Boost置于其界面中。 myAnyType是Boost的一部分,因为它基于Boost的一部分。因此,您的客户是Boost的客户。你和他们越早接受,越好。

答案 1 :(得分:0)

不,这是不可能的,因为编译器需要查看类型的完整定义才能在客户端程序中实例化它。因此,需要提供升压头。

答案 2 :(得分:0)

如果它只是一个typedef,如果没有物理依赖,你可以使用前向声明。说明:

namespace MON {
class t_hidden_type; // << the forward
typedef t_hidden_type& t_opaque_type_ref; // << the typedef
}

这样,不需要包含。

当然,如果确实需要隐藏实现,你也可以包装隐藏类型 - 这也将重命名二进制符号。

namespace MON {
class myAnyType; // in the public interface
}

namespace MON {
namespace Private {
// in the private/package interface
class myAnyType {
  ...
  boost::any d_any;
};
}
}