Пожалуйста, объясните значение этого кода шаблона C ++ - PullRequest
1 голос
/ 09 января 2012
template<typename HELPER_>
class A{
     public:

        typedef HELPER_ HELPER ;
        typedef typename HELPER::TRAITS_  TRAITS_2;
     // other stuff....
};

Мой вопрос в том, что HELPER_ - это тип, тогда HELPER также будет типом, тогда что означает HELPER::TRAITS _. аналогично, если HELPER не является именем класса, это просто указание неизвестного типа. Но в приведенном выше коде создается впечатление, что HELPER - это имя класса, и он вызывает имя своей публичной переменной TRAITS_.

Я хочу знать, что означает приведенный выше код.

Ответы [ 4 ]

1 голос
/ 09 января 2012

Код позволяет указывать индивидуальные черты в классе шаблона, используя отдельный класс для определения этих черт.Он использует typedef, чтобы помочь завершить абстракцию.Например, вы можете настроить класс черты таким образом, чтобы A::TRAITS_ получился похожим на int (отметив, что имена типов во всех заглавных буквах с завершающим подчеркиванием несколько необычны):

class MyTraits
{
public:
    typedef int TRAITS_;
};

template<typename HELPER_>
class A{
     public:

        typedef HELPER_ HELPER ;
        typedef typename HELPER::TRAITS_  TRAITS_2;
     // other stuff....
};

// A<MyTraits>::TRAITS_2 is now `int`.
1 голос
/ 09 января 2012

В этом коде предполагается, что для любого используемого параметра шаблона HELPER_, HELPER_::TRAITS_ существует и является типом имени.

Что на самом деле делает код:

Для типа X этот код устанавливает, что A<X>::TRAITS_2 определен как тот же тип, что и X::TRAITS_

1 голос
/ 09 января 2012
typedef HELPER_ HELPER ;

Псевдонимы HELPER_ как HELPER в пространстве имен классов, поэтому A<B>::HELPER становится эквивалентным B.Это может быть полезно в коде шаблона.

typedef typename HELPER::TRAITS_  TRAITS_2;

Псевдонимы HELPER::TRAITS _ как TRAITS_2 в пространстве имен класса, поэтому A<B>::TRAITS_2 становится эквивалентным B::TRAITS_.typename необходимо, потому что компилятор не знает, что HELPER::TRAITS_ - это тип без определения HELPER.

0 голосов
/ 09 января 2012

TRAITS_ - это вложенное имя внутри того, что HELPER_ окажется. Поскольку перед этим вложенным именем ставится typename, ожидается, что он будет обозначать тип .

Пример:

#include <string>
#include <iostream>

template<class T>
struct X{
  typedef typename T::some_type some_type;
  X(some_type const& p)
    : m(p) {}

private:
  some_type m;
};

struct A{
  typedef int some_type;
};

struct B{
  typedef std::string some_type;
};

int main(){
  X<A> x1(5);
  X<B> x2("hi");
  std::cout << "X<A>::m = " << x1.m << ", X<B>::m = " << x2.m "\n";
}

Выход:

X :: m = 5, X :: m = hi

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...