Класс шаблона, объявляющий указатель на его неспециализированный self [duplicate]

Если я прочитал спецификации прямо, тогда let, к счастью, также можно использовать, чтобы избежать самоназывающих функций, используемых для имитации только частных членов - популярного шаблона дизайна, который уменьшает читаемость кода, затрудняет отладку, что не добавляет реального кода защиты или другой пользы - за исключением, возможно, удовлетворения чьего-то желания семантики, поэтому прекратите ее использовать. / rant

var SomeConstructor;

{
    let privateScope = {};

    SomeConstructor = function SomeConstructor () {
        this.someProperty = "foo";
        privateScope.hiddenProperty = "bar";
    }

    SomeConstructor.prototype.showPublic = function () {
        console.log(this.someProperty); // foo
    }

    SomeConstructor.prototype.showPrivate = function () {
        console.log(privateScope.hiddenProperty); // bar
    }

}

var myInstance = new SomeConstructor();

myInstance.showPublic();
myInstance.showPrivate();

console.log(privateScope.hiddenProperty); // error

См. « Эмуляция частных интерфейсов »

8
задан Barry 17 June 2015 в 12:27
поделиться

1 ответ

Это называется «имя введенного класса». Правило конкретно исходит от [temp.local]:

Как и обычные (не шаблонные) классы, у шаблонов классов есть имя-инъекции-класс (раздел 9) , Имя injected-class-name может использоваться как имя шаблона или имя . Когда он используется с template-argument-list , в качестве шаблона-аргумента для шаблона template-parameter или в качестве конечного идентификатора в спецификаторе специфицированного типа объявления шаблона класса друга, он относится к самому шаблону класса. В противном случае это эквивалентно имя-шаблона , за которым следуют шаблонные параметры шаблона класса, заключенного в <>.

В рамках специализации шаблона класса или частичного специализация, когда имя injected-class-name используется как имя типа , оно эквивалентно имени шаблона , за которым следует template-arguments специализации шаблона класса или частичной специализации, заключенной в & lt;>. [Пример:

template<template<class> class T> class A { };
template<class T> class Y;
template<> class Y<int> {
    Y* p;                                // meaning Y<int>
    Y<char>* q;                          // meaning Y<char>
    A<Y>* a;                             // meaning A<::Y>
    class B {
        template<class> friend class Y;  // meaning ::Y
    };
};

-end example]

Это в основном для удобства, так что имя класса внутри класса относится к самому классу, а не к внешнему, которое может иметь одно и то же имя. Для шаблонов классов это потенциально экономит много ввода, если у вас длинный список аргументов шаблона.

13
ответ дан Barry 28 August 2018 в 19:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: