我看到像
这样的陈述typedef * unspecified * value_type;
typedef * unspecified * reference;
在Boost :: multi_array类的声明中。
namespace boost {
template <typename ValueType,
std::size_t NumDims,
typename Allocator = std::allocator<ValueType> >
class multi_array {
public:
// types:
typedef ValueType element;
typedef *unspecified* value_type;
typedef *unspecified* reference;
typedef *unspecified* const_reference;
typedef *unspecified* difference_type;
typedef *unspecified* iterator;
typedef *unspecified* const_iterator;
typedef *unspecified* reverse_iterator;
typedef *unspecified* const_reverse_iterator;
typedef multi_array_types::size_type size_type;
typedef multi_array_types::index index;
typedef multi_array_types::index_gen index_gen;
typedef multi_array_types::index_range index_range;
typedef multi_array_types::extent_gen extent_gen;
typedef multi_array_types::extent_range extent_range;
typedef *unspecified* storage_order_type;
*未指明*在这里意味着什么?这是C ++ 11标准吗?
答案 0 :(得分:13)
我在文档中假设这个,而不是可编译的代码,因为它不可编译。
通常这样做是为了表明typedef可以使用,但是它的别名类型取决于实现,并且不被视为公共接口的一部分。
在这种情况下,可编译头文件包含以下行的声明:
typedef typename super_type::value_type value_type;
其中别名类型在基类中定义。深入挖掘,反过来来自另一个基类,实际类型深深埋藏在实现细节中,具有不同的定义取决于数组的维数;对于一维数组,此特定类型为ValueType
,对于更高维度,此multi_array<ValueType,NumDims-1>
类型。
答案 1 :(得分:9)
看起来它是从this documentation复制的。 *unspecified*
只是意味着,它与您完全无关,而且它是一个实现细节。不要再深入了解它,只是承认,typedef就在那里。
答案 2 :(得分:2)
我刚刚打开了multi_array.hpp标头,并且(正如预期的那样)它没有这样的typedef,但它看起来像这样:
template<typename T, std::size_t NumDims,typename Allocator>
class multi_array :
public multi_array_ref<T,NumDims>
{
typedef multi_array_ref<T,NumDims> super_type;
public:
typedef typename super_type::value_type value_type;
typedef typename super_type::reference reference;
typedef typename super_type::const_reference const_reference;
typedef typename super_type::iterator iterator;
typedef typename super_type::const_iterator const_iterator;
typedef typename super_type::reverse_iterator reverse_iterator;
typedef typename super_type::const_reverse_iterator const_reverse_iterator;
typedef typename super_type::element element;
typedef typename super_type::size_type size_type;
typedef typename super_type::difference_type difference_type;
typedef typename super_type::index index;
typedef typename super_type::extent_range extent_range;
// ...
如果您正在阅读reference pages for boost::multi_array,那么这意味着您应该使用该typedef,而不是您自己的类型。我想在编写模板类时应该真正使用那些typedef。
答案 3 :(得分:1)
没有。这意味着特定的实现可以将其定义为任何它想要的。这是一个规范 - 不是实际可编译的C ++。
答案 4 :(得分:0)
unspecified是在boost :: units :: detail命名空间中定义的空结构。
它被用作父类中的占位符返回类型(认为继承),利用它可以在具有适当返回类型的任何未来派生类中重载的事实。 通用编程中可能还有其他一些用途。 当我发现更多例子时,我会继续添加。