for(var key in validation_messages){
for(var subkey in validation_messages[key]){
//code here
//subkey being value, key being 'yourname' / 'yourmsg'
}
}
Конечно. Вам нужен контекст, который разрешает расширение пакета - простой является скоординированным списком инициализаторов, который также имеет преимущество для оценки слева направо:
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());
Демонстрация .