隐藏类型定义实现
Hide typedef implementatation
我有这个 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;
};
}
}
相关文章:
- 如何正确实现和访问运算符的各种自定义枚举器
- 根据C++标准的定义实现"is_similar"类型特征
- 如何实现自定义匹配器以检查 Catch2 中的对象相等性
- 它是否定义了哪些算法可以接受可变 lambda 的实现?
- C++:实现定义了可接受的物理源文件字符
- 未定义与未指定与实现定义的行为
- 如何从uint8_t的缓冲区读取带符号整数,而不调用未定义或实现定义的行为
- 在哪里查找 GCC 实现定义行为的实现?
- 高效的无符号到签名转换,避免实现定义的行为
- C++中是否有实现定义行为的完整列表
- char的实现定义是否会影响std::string
- 强制实现/定义函数声明
- 实现定义为使用保留向量而不调整其大小
- 实现定义的文件流同步 - 原因
- 为什么 1 << 31 在 C++14 中更改为实现定义?
- 是实现定义的unsigned short + int类型
- 实现定义的行为和将unicode读取到缓冲区
- 为什么name()函数返回的字符串是实现定义的
- main()的链接是由实现定义的,这意味着什么
- Visual Studio 2010 - 为什么字符串文本比较是C++中实现定义的行为