Используя элементы постоянного массива как случаи в операторе переключения

Хорошо. Итак, после того, как я в течение целого дня гонялся за рассказом, наконец-то появился свет ...

В мобильных IOS нет такой вещи, как «щелчок» в качестве прослушивателя событий, однако «затронутый» находится в списке элементов:

https://developer.apple.com/ библиотека / архив / документация / AppleApplications / Reference / SafariWebContent / HandlingEvents / HandlingEvents.html # // apple_ref / doc / uid / TP40006511-SW8

Поэтому я протестировал его и устроил небольшой праздник, как он работал !!!!! сейчас я только что продублировал код, чтобы он работал, но позже мне придется его переписать. Затем стиль кнопки будет смотреть на это немного позже.

document.addEventListener("touchend", function(e) {
  if (e.target.id === "burger-time"){
    document.querySelector('nav').classList.add('open');
    document.getElementById('burger-time').style.visibility ='hidden';
  } else {
    document.querySelector('nav').classList.remove('open');
    document.getElementById('burger-time').style.visibility ='visible';
  }
});

document.addEventListener("click", function(e) {
  if (e.target.id === "burger-time"){
    document.querySelector('nav').classList.add('open');
    document.getElementById('burger-time').style.visibility ='hidden';
  } else {
    document.querySelector('nav').classList.remove('open');
    document.getElementById('burger-time').style.visibility ='visible';
  }
});

6
задан awall 15 December 2008 в 05:44
поделиться

7 ответов

Ссылки на массив не являются "достаточно постоянными", независимо.

Просто необходимо сделать отображение немного по-другому. Вы хотите, чтобы то же действие произошло, когда логическая клавиша нажата, поэтому используйте логические коды клавиши в case пункты switch оператор. Затем отобразите фактический код клавиши на логический код, возможно в switch самостоятельно, или возможно заранее. Можно все еще использовать массив LogicalMappings или подобную конструкцию. И, как помощь G11N (глобализация), можно даже сделать отображающийся массив непостоянным так, чтобы различные люди могли повторно отобразить ключи для удовлетворения их потребностям.

2
ответ дан 17 December 2019 в 02:35
поделиться

Что касается разделов стандарта C++: 6.4.2 требует, чтобы case-выражения оценили к интегралу или постоянному перечислению. 5.19 определяет, каково это:

Интегральное константное выражение может включить только литералы (2.13), перечислители, переменные константы или статические элементы данных интеграла или перечисляемых типов, инициализированных с константными выражениями (8.5), не ввести шаблонные параметры интеграла или перечисляемых типов и sizeof выражений. Плавающие литералы (2.13.3) могут появиться, только если они брошены к интегралу или перечисляемым типам. Только преобразования типов к интегралу или перечисляемым типам могут использоваться. В частности, кроме sizeof выражений, функции, объекты класса, указатели или ссылки не должны использоваться, и присвоение, инкремент, декремент, вызов функции, или операторы запятой не должны использоваться.

Таким образом, если Ваш вопрос был, "почему компилятор отклоняет это", один ответ, "потому что в стандарте говорится так".

3
ответ дан 17 December 2019 в 02:35
поделиться

Существует ли оператор сравнения, определенный для "LogicalMappings"? Если не затем это - ошибка.

0
ответ дан 17 December 2019 в 02:35
поделиться

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

1
ответ дан 17 December 2019 в 02:35
поделиться

Вы могли также использовать массив указателей функции или функторов (я предполагаю адреса функтора), чтобы избежать оператора переключения в целом и просто пойти от индекса массива-> указатель функции / функторы непосредственно.

например (предупреждение, непротестированный код следует),

class Event // you probably have this defined already
{
}

class EventHandler // abstract base class
{
public:
  virtual void operator()(Event& e) = 0;
};

class EventHandler1
{
  virtual void operator()(Event& e){
    // do something here 
  }
};
class EventHandler2
{
  virtual void operator()(Event& e){
    // do something here 
  }
};

EventHandler1 ev1;
EventHandler2 ev2;
EventHandler *LogicalMappings[countof_LOGICAL_KEYS] = {
  &ev1,
  &ev2,
  // more here...

};

// time to use code:
Event event;
if (event.key.keysym.key < countof_LOGICAL_KEYS)
{
   EventHandler *p = LogicalMappings[event.key.keysym.key];
   if (p != NULL)
      (*p)(event);
}
0
ответ дан 17 December 2019 в 02:35
поделиться

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

0
ответ дан 17 December 2019 в 02:35
поделиться

Гуру компилятора на работе объяснил это мне. Проблема состоит в том, что сам массив является постоянным, но индексы к нему являются не обязательно константой. Таким образом выражение LogicalMappings [some_variable] не могло быть оценено во время компиляции, таким образом, массив завершает то, чтобы быть сохраненным в памяти так или иначе вместо того, чтобы быть скомпилированным. Нет все еще никакой причины, почему компилятор не мог статически оценить ссылки на массив с константой или литеральным индексом, поэтому что я хочу сделать, должно теоретически быть возможным, но это немного более хитро, чем я думал, таким образом, я могу понять, почему gcc не делает этого.

0
ответ дан 17 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

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