2011-04-07 58 views
9

我看到像* unspecified *在C++ typedef語句中指的是什麼?

的typedef聲明*不明* 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標準嗎?

+6

這是從文檔複製而不是編譯頭文件?這對我來說看起來並不像是有效的C++,但看起來像是試圖告訴你typedef存在的文檔,而不告訴你將來可能會改變的基礎類型的真實名稱。 – Stewart 2011-04-07 12:14:49

+0

你從哪裏看到它的? – 2011-04-07 12:16:10

+0

只是要模仿斯圖爾特的評論:如果你打開multy_array.hpp,你不會找到任何「*未指定*」的標記。有參考依賴於teplate參數的基類。 – Eugene 2011-04-07 12:33:26

回答

13

我假設這是在文檔中,而不是編譯代碼,因爲它是不可編譯的。

這樣做通常表明typedef可供使用,但其別名的類型取決於實現並且不被視爲公共接口的一部分。

在這種情況下,上述的可編譯頭文件包含沿的線的聲明:其中別名類型以基類中定義

typedef typename super_type::value_type value_type; 

。挖掘更深入,反過來又來自另一個基類,實際的類型深深地埋藏在實現細節中,不同的定義取決於數組有多少個維度;對於一維陣列,此特定類型爲ValueType,對於較高維度爲multi_array<ValueType,NumDims-1>

1

不。它意味着一個特定的實現可能會將其定義爲任何想要的。這是在規範中 - 而不是實際可編譯的C++。

2

我剛打開multi_array.hpp標題,(如預期),它沒有這樣的類型定義,但它看起來像這樣:

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,而不是你自己的類型。我想在編寫模板類時應該真正使用這些typedefs。

9

看起來好像是從this documentation複製的。 *unspecified*只是意味着它與你完全無關,而且它是一個實現細節。不要再深入瞭解它,只是承認,typedef在那裏。

0

unspecified是在boost :: units :: detail命名空間中定義的空結構。

它被用作父類中的佔位符返回類型(思想繼承),利用它可以在任何將來派生類中重載並具有適當返回類型的事實。 在泛型編程中可能有其他幾種用法。 當我找到更多的例子時,我將繼續在這裏添加。