Сделать параметр шаблона другом?

Если вы можете выполнить скрипты PHP непосредственно в оболочке, например:

$ script.php

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

#!/usr/bin/php

Эта линия называется shebang . Строка может отличаться в вашей системе, вам нужно знать полный путь к файловой системе двоичного кода PHP CLI, который вы хотите использовать для этого скрипта.

Если вы запустите этот файл в оболочке, указанный двоичный код будет использоваться. То же самое для cron.

Если вы выполняете этот файл через ваш веб-сервер, PHP будет автоматически отключать эту строку.

См. Также: Особенности: Использование PHP из командной строки

37
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

Это явно запрещено в стандарте, даже если некоторые версии VisualStudio действительно позволяют его.

Стандарт C++ 7.1.5.3 Разработанных спецификаторов типа, абзац 2

3.4.4 описывает, как поиск имени продолжается для идентификатора в elaborated-type-specifier. Если идентификатор решает к имени класса или перечислимому имени, elaborated-type-specifier вводит его в объявление тем же путем, простой спецификатор типа представляет свое имя типа. Если идентификатор решает к имени определения типа или шаблонному параметру типа, elaborated-type-specifier плохо формируется. [Отметьте: это подразумевает что, в рамках шаблона класса с шаблонным параметром типа T, друг объявления класс T; плохо формируется.]

Я распознаю, что код выше как шаблон изолирует (запретите расширение), класс. Существует другое решение, которое действительно не блокирует расширение, но это отметит unadvertidly, расширяющийся от класса. Как замечено в ADOBE Source Library:

namespace adobe { namespace implementation {
template <class T>
class final
{
protected:
   final() {}
};
}}
#define ADOBE_FINAL( X ) private virtual adobe::implementation::final<T>

с использованием:

class Sealed : ADOBE_FINAL( Sealed )
{//...
};

В то время как это позволяет расширение при реальном принуждении его:

class SealBreaker : public Sealed, ADOBE_FINAL( Sealed )
{
public:
   SealBreaker() : adobe::implementation::final<Sealed>(), Sealed() {}
};

Это ограничит пользователей в, по ошибке делают это.

Править:

Предстоящий C++ 11 стандартов действительно позволяет Вам оказывать поддержку аргументу типа с немного отличающимся синтаксисом:

template <typename T>
class A {
   // friend class T; // still incorrect: elaborate type specifier
   friend T;          // correct: simple specifier, note lack of "class"
};
40
ответ дан 27 November 2019 в 04:43
поделиться

Необходимо ли действительно сделать это? Если Вы хотите препятствовать тому, чтобы кто-то произошел из Вашего класса, просто добавьте комментарий и сделайте деструктор невиртуальным.

2
ответ дан 27 November 2019 в 04:43
поделиться
Другие вопросы по тегам:

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