Хорошо. Итак, после того, как я в течение целого дня гонялся за рассказом, наконец-то появился свет ...
В мобильных IOS нет такой вещи, как «щелчок» в качестве прослушивателя событий, однако «затронутый» находится в списке элементов:
Поэтому я протестировал его и устроил небольшой праздник, как он работал !!!!! сейчас я только что продублировал код, чтобы он работал, но позже мне придется его переписать. Затем стиль кнопки будет смотреть на это немного позже.
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';
}
});
Ссылки на массив не являются "достаточно постоянными", независимо.
Просто необходимо сделать отображение немного по-другому. Вы хотите, чтобы то же действие произошло, когда логическая клавиша нажата, поэтому используйте логические коды клавиши в case
пункты switch
оператор. Затем отобразите фактический код клавиши на логический код, возможно в switch
самостоятельно, или возможно заранее. Можно все еще использовать массив LogicalMappings или подобную конструкцию. И, как помощь G11N (глобализация), можно даже сделать отображающийся массив непостоянным так, чтобы различные люди могли повторно отобразить ключи для удовлетворения их потребностям.
Что касается разделов стандарта C++: 6.4.2 требует, чтобы case-выражения оценили к интегралу или постоянному перечислению. 5.19 определяет, каково это:
Интегральное константное выражение может включить только литералы (2.13), перечислители, переменные константы или статические элементы данных интеграла или перечисляемых типов, инициализированных с константными выражениями (8.5), не ввести шаблонные параметры интеграла или перечисляемых типов и sizeof выражений. Плавающие литералы (2.13.3) могут появиться, только если они брошены к интегралу или перечисляемым типам. Только преобразования типов к интегралу или перечисляемым типам могут использоваться. В частности, кроме sizeof выражений, функции, объекты класса, указатели или ссылки не должны использоваться, и присвоение, инкремент, декремент, вызов функции, или операторы запятой не должны использоваться.
Таким образом, если Ваш вопрос был, "почему компилятор отклоняет это", один ответ, "потому что в стандарте говорится так".
Существует ли оператор сравнения, определенный для "LogicalMappings"? Если не затем это - ошибка.
Я пойду на конечность здесь, так как никто больше не ответил на это, и я главным образом делал Java недавно, не C++, но насколько я, кажется, вспоминаю, что поиск массива не считают постоянным целым числом, даже если результат поиска может быть определен во время компиляции. Это может даже быть проблемой в синтаксисе.
Вы могли также использовать массив указателей функции или функторов (я предполагаю адреса функтора), чтобы избежать оператора переключения в целом и просто пойти от индекса массива-> указатель функции / функторы непосредственно.
например (предупреждение, непротестированный код следует),
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);
}
Существует библиотека, названная сигналом в повышении, которое поможет Вам создать абстракцию отображения события. Если у Вас есть время, это должно быть лучшим подходом
Гуру компилятора на работе объяснил это мне. Проблема состоит в том, что сам массив является постоянным, но индексы к нему являются не обязательно константой. Таким образом выражение LogicalMappings [some_variable] не могло быть оценено во время компиляции, таким образом, массив завершает то, чтобы быть сохраненным в памяти так или иначе вместо того, чтобы быть скомпилированным. Нет все еще никакой причины, почему компилятор не мог статически оценить ссылки на массив с константой или литеральным индексом, поэтому что я хочу сделать, должно теоретически быть возможным, но это немного более хитро, чем я думал, таким образом, я могу понять, почему gcc не делает этого.