Как определить & ldquo; последние 2 цифры не являются & hellip; & rdquo; в ветке

Да, он плохо сформирован. Вот почему:

Функция constexpr должна быть определена (не просто объявлена) перед использованием в постоянном выражении.

Итак, например:

constexpr int f(); // declare f
constexpr int x = f(); // use f - ILLEGAL, f not defined
constexpr int f() { return 5; } // define f, too late
Определения функций

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

Итак, это:

struct X {
  constexpr static int size() { return 5; }
  static const int array[size()]; 
};

Анализируется в следующем порядке:

struct X {
   constexpr inline static int size(); // function body defered
   static const int array[size()];  // <--- POINT A
};

constexpr inline int X::size() { return 5; }

То есть разбор тел функций откладывается до тех пор, пока не будет указан спецификатор класса.

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

struct X
{
    void f() { T t; /* OK */ }
    typedef int T;
};

По сравнению с областью пространства имен:

void f() { T t; /* error, T not declared */ }
typedef int T;

На POINT A компилятор еще не имеет определения size(), поэтому он не может его вызвать. Для производительности компиляции constexpr функции должны быть определены перед их использованием в блоке трансляции перед вызовом во время компиляции, иначе компилятор должен будет сделать несколько проходов только для «ссылки» постоянных выражений для оценки.

1
задан COOLak 6 March 2019 в 23:07
поделиться

1 ответ

Как советовали в комментарии, я использовал регулярное выражение. Поэтому я придумал следующее:

{{ numberOfComments }} {% if numberOfComments|last == 1 and not (numberOfComments matches '{11$}') %}комментарий{% elseif numberOfComments|last > 1 and numberOfComments|last < 5 and not (numberOfComments matches '{1[2-4]$}') %}комментария{% else %}комментариев{% endif %}

Регулярное выражение {11$} выбирает любую строку, которая заканчивается на 11. {} просто для определения регулярного выражения в Twig. [115 ]

UPD: добавлена ​​недостающая логика для чисел, оканчивающихся на 12-14, которые отсутствовали в вопросе, но на самом деле необходимы.

0
ответ дан COOLak 6 March 2019 в 23:07
поделиться
Другие вопросы по тегам:

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