Эквивалентный троичный оператор для constexpr if?

Я использую это, чтобы поймать ошибку JSON

try {
   $.getJSON(ajaxURL,callback).ajaxError();
} catch(err) {
   alert("wow");
   alert("Error : "+ err);
}

Изменить: альтернативно вы также можете получить сообщение об ошибке. Это позволит вам точно узнать, что такое ошибка. Попробуйте выполнить следующий синтаксис в блоке catch

alert("Error : " + err);
24
задан wimalopaan 7 December 2016 в 08:08
поделиться

2 ответа

Нет, нет constexepr условного оператора. Но вы можете обернуть все это в лямбду и сразу же оценить ее ( IIFE ):

template<typename Mode>
class BusAddress {
public:
    explicit constexpr BusAddress(Address device)
     : mAddress([&]{
          if constexpr (Mode::write) {
            return device.mDevice << 1;
          }
          else {
            return (device.mDevice << 1) | 0x01;
          }         
        }())
     { }
private:
    uint8_t mAddress = 0;    
};

Возможно, это не самый сексуальный код, но он выполняет свою работу. Обратите внимание, что лямбды по умолчанию constexpr, где это возможно, начиная с N4487 и P0170 .

13
ответ дан Barry 7 December 2016 в 08:08
поделиться

Кажется, вы действуете, полагая, что if constexpr - это оптимизация производительности. Это не . Если вы поместите константное выражение в предложение ?:, любой компилятор, который стоит использовать, выяснит, к чему он относится, и удалит условие. Таким образом, код, который вы написали, почти наверняка скомпилируется в одну опцию для конкретного Mode.

Основная цель if constexpr состоит в том, чтобы полностью исключить другую ветвь. То есть компилятор даже не проверяет, является ли он синтаксически действительным . Это было бы для чего-то, где вы if constexpr(is_default_constructible_v<T>), и если это правда, вы делаете T(). С помощью регулярного оператора if, если T не является конструируемым по умолчанию, T() все равно должен быть синтаксически допустимым кодом, даже если окружающее предложение if является константным выражением. if constexpr устраняет это требование; компилятор будет отбрасывать операторы, которые не находятся в другом условии.

Это становится еще более сложным для ?:, потому что тип выражения основан на типах двух значений. Таким образом, оба выражения должны быть допустимыми, даже если одно из них никогда не оценивается. Форма constexpr из ?: предположительно отбросит альтернативу, которая не используется во время компиляции. И поэтому тип выражения должен действительно основываться только на одном из них.

Это совсем другая вещь.

13
ответ дан Nicol Bolas 7 December 2016 в 08:08
поделиться
Другие вопросы по тегам:

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