Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 隐藏typedef实现_C++_Boost_C++11 - Fatal编程技术网

C++ 隐藏typedef实现

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):

#包括
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;
};
}
}