C++ 隐藏typedef实现
我的typedef依赖于另一个库中的类型(本例中为boost):C++ 隐藏typedef实现,c++,boost,c++11,C++,Boost,C++11,我的typedef依赖于另一个库中的类型(本例中为boost): #包括 typedef boost::any&myAnyType; 我会在我的所有程序中使用myAnyType定义,隐藏其真实性质并保持独立于Boost库(客户端不需要安装Boost即可使用myAnyType) 有可能吗?不,这是不可能的,因为编译器需要查看类型的完整定义,以便在客户端程序中实例化它。因此,需要提供增压头 客户端不需要安装Boost就可以使用myAnyType 确实如此。是的,您将其定义为对any的引用,这样他们
#包括
typedef boost::any&myAnyType;
我会在我的所有程序中使用myAnyType定义,隐藏其真实性质并保持独立于Boost库(客户端不需要安装Boost即可使用myAnyType)
有可能吗?不,这是不可能的,因为编译器需要查看类型的完整定义,以便在客户端程序中实例化它。因此,需要提供增压头 客户端不需要安装Boost就可以使用myAnyType 确实如此。是的,您将其定义为对
any
的引用,这样他们就可以声明一个“myAnyType”变量,而不必定义该类型。但他们对此无能为力。事实上,像myAnyType var代码>失败,因为它是引用
它们甚至不能调用将myAnyType
作为参数的函数,因为它们不能声明myAnyType
对象。即使是 const MyYyType 也不起作用,因为C++必须创建一个临时的。它不能从未定义的类型创建临时的
您的库不是独立于Boost的;它依赖于Boost,并将Boost放在其接口中myAnyType
是Boost的一部分,因为它基于Boost的一部分。因此,您的客户是Boost的客户。你和他们越早接受这一点越好。如果它只是一个typedef,如果没有物理依赖性,可以通过使用转发声明来获得。举例说明:
namespace MON {
class t_hidden_type; // << the forward
typedef t_hidden_type& t_opaque_type_ref; // << the typedef
}
我倾向于同意,但有一点需要注意:如果你设计你的库,使实例化myAnyType
对象的唯一方法是通过你的库提供的工厂函数,那么用户需要知道的就是myAnyType*
——在用户可见的一面,你也可以typedef void*
。没有错误(除非你考虑C++中使用指针“错误”)。这种类型的要点是它可以是任何对象。它是一个选中的类型void*
。用工厂函数创建它们是没有意义的。
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;
};
}
}