Рекурсия шаблона с std :: index_sequences / std :: tuples: что здесь делает компилятор? [Дубликат]

for(var key in validation_messages){
    for(var subkey in validation_messages[key]){
        //code here
        //subkey being value, key being 'yourname' / 'yourmsg'
    }
}
13
задан T.C. 12 January 2016 в 08:09
поделиться

1 ответ

Конечно. Вам нужен контекст, который разрешает расширение пакета - простой является скоординированным списком инициализаторов, который также имеет преимущество для оценки слева направо:

using expander = int[];
(void) expander { 0, ((void) As::id(), 0)... };
  • ... расширяет узор слева от него; в этом случае шаблон является выражением ((void) As::id(), 0).
  • , в выражении является оператором запятой, который оценивает первый операнд, отбрасывает результат, затем оценивает второй операнд и возвращает результат.
  • Функция (void), установленная на As::id(), существует для защиты от перегрузки operator, и может быть опущена, если вы уверены, что ни один из вызовов As::id() не вернет то, что перегружает запятую.
  • 0 в правой части оператора запятой состоит в том, что expander представляет собой массив из int s, поэтому все выражение (которое используется для инициализации элемента массива) должно оцените int.
  • Первый 0 гарантирует, что мы не пытаемся создать недопустимый массив 0-размера, когда As является пустым пакетом.

Demo .


В C ++ 17 (если повезет), все тело C::id можно заменить на двоичным сглаживанием : (A::id(), ... , (void) As::id()); Демонстрация .

27
ответ дан T.C. 27 August 2018 в 23:15
поделиться
Другие вопросы по тегам:

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