Как скрыть список шаблонов от шаблонного класса, используя псевдоним типа - PullRequest
0 голосов
/ 06 февраля 2020

(Это для C ++ 11)

Я пытаюсь скрыть список шаблонов шаблонного класса, используя псевдоним типа, чтобы сделать код более читабельным. Но это не работает, и я даже не уверен, возможно ли это сделать.

Мой код выглядит примерно так:

template<
    class A,
    class B,
    ...
    class Z>
class Class1
{
    A objA;
    B objB;
    ...
    Z objZ;
};


// Define an alias for Class1 to hide all its template parameters
// in a way that is re-usable from other classes
typedef typename Class1<class A, class B, ..., class Z> Type_Class1


template<
    class A,
    class B,
    ...
    class Z>
class Class2
{
    // Create an obj of Class1, 
    Type_Class1 class1Obj;

    ...
}

...

template<
    class A,
    class B,
    ...
    class Z>
class ClassN
{
    // Create an obj of Class1
    Type_Class1 class1Obj;

    ...
}

Мое намерение:

  1. Сохраняйте строки, определяющие все параметры шаблона, каждый раз, когда я создаю объект класса 1
  2. Избегайте указания типа псевдонима в каждом классе, где я хочу создать объект класса 1

Любые идеи?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

То, что вы пытаетесь сделать, не работает.

Если я правильно понимаю, вы хотите, чтобы Type_Class1 в определениях классов было таким же, как Type_Class1<A, ..., Z>, то есть аргументы шаблона такие же типы, как параметры шаблона класса.

Это возможно только в самом классе:

template<
    class A,
    class B,
    ...
    class Z>
class Class2
{
    using Type_Class1 = Class1<A, ..., Z>;

    // Create an obj of Class1, 
    Type_Class1 class1Obj;

    ...
};

Вы не можете сделать это вне класса, потому что это выходит за рамки параметры, от которых вы хотите сделать тип зависимым.


То, что вы написали, имеет совершенно другое поведение. Ключевое слово class при использовании в списке аргументов шаблона, а не в списке параметров определения шаблона, имеет совершенно другое значение и необычное поведение, которое вам, вероятно, не нужно.

Это так называемое разработан спецификатор типа и позволяет объявлять новые классы с заданными именами во включающей области имен (если еще нет типа класса с таким именем, который можно найти при поиске по имени).

Ваш Type_Class1 будет Class1 с аргументами шаблона, равными этим классам, а не параметрами шаблона класса, в котором вы используете Type_Class1.

0 голосов
/ 06 февраля 2020

Как насчет

using Type_Class1 = Class1<A, B, ..., Z>;

Обратите внимание, что с using или typedef вы бы сделали Class1<A,...> вместо Class<class A,...>.

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