Что означает * unspecified * в выражении C ++ typedef? - PullRequest
9 голосов
/ 07 апреля 2011

Я вижу такие выражения, как

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?

Ответы [ 5 ]

13 голосов
/ 07 апреля 2011

Я предполагаю это в документации, а не в компилируемом коде, поскольку он не компилируется.

Обычно это делается для указания того, что typedef доступен для использования, но тип, который он псевдоним, зависит от реализации и не считается частью открытого интерфейса.

В этом случае файл скомпилируемого заголовка содержит объявления в виде строк:

typedef typename super_type::value_type value_type;

где псевдоним определяется в базовом классе. Если копнуть глубже, то это, в свою очередь, происходит из другого базового класса, а фактический тип глубоко скрыт в деталях реализации, с различными определениями в зависимости от того, сколько измерений имеет массив; этот конкретный тип ValueType для одномерного массива и multi_array<ValueType,NumDims-1> для более высоких измерений.

9 голосов
/ 07 апреля 2011

Похоже, оно скопировано из этой документации .*unspecified* просто означает, что это не имеет к вам никакого отношения и что это деталь реализации.Не заглядывайте дальше, просто признайте, что здесь есть typedef.

2 голосов
/ 07 апреля 2011

Я только что открыл заголовок multi_array.hpp, и (как и ожидалось) у него нет таких typedefs, но это выглядит так:

    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;
   // ...

Если вы читаете справочные страницы для boost :: multi_array , то это означает, что вы должны использовать этот typedef вместо вашего собственного типа. Я думаю, что эти typedefs должны действительно использоваться при написании шаблонных классов.

1 голос
/ 07 апреля 2011

Нет.Это означает, что конкретная реализация может определить его так, как ему хочется.Это в спецификации, а не на компиляции C ++.

0 голосов
/ 12 августа 2012

unspecified - пустая структура, определенная в пространстве имен boost :: units :: detail.

Он используется просто как тип возврата заполнителя в родительском классе (думайте о наследовании), используя тот факт, что он может быть перегружен в любом будущем производном классе с соответствующим типом возврата. Там может быть несколько других применений в общем программировании. Я буду продолжать добавлять здесь, как и когда я узнаю больше примеров.

...