我有这个 typedef 依赖于另一个库中的类型(在这种情况下是boost):
#include <boost/any.hpp>
typedef boost::any& myAnyType;
我会在我的所有程序中使用定义 myAnyType 隐藏其真实性并保持与Boost库的独立性(客户端不需要安装Boost来使用myAnyType)
有可能吗?
答案 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;
};
}
}