隐藏类型定义实现

Hide typedef implementatation

本文关键字:实现 定义 类型 隐藏      更新时间:2023-10-16

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

#include <boost/any.hpp>
typedef boost::any& myAnyType;

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

有可能吗?

客户端不需要安装Boost来使用myAnyType

确实如此。是的,您将其定义为对any的引用,因此它们可以声明"myAnyType"变量,而无需定义该类型。但他们不能用它做任何事情。事实上,像myAnyType var;这样简单的东西失败了,因为它是一个引用。

它们甚至不能调用以myAnyType为参数的函数,因为它们不能声明myAnyType对象。即使是const myAnyType也不行,因为c++必须创建一个临时的。而且它不能从未定义的类型中创建临时类型。

你的库不是独立于Boost;它依赖于的Boost,它把Boost放在它的接口中。myAnyType是Boost的一部分,因为它基于Boost的一部分。因此,您的客户就是Boost的客户。你和他们越早接受这一点越好。

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

如果它只是一个类型定义,如果没有物理依赖,则可以通过使用前向声明获得。说明:

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;
};
}
}