Да, это запрещено. Вы не первый, кто придумал эту совершенно логичную идею. По-моему, это один из очевидных «ошибок» / «упущений» в спецификации указателей на членов на C ++, но, по-видимому, комитет не заинтересован в дальнейшем развитии спецификации указателей на членов ( в случае с большинством «низкоуровневых» языковых функций).
Обратите внимание, что все необходимое для реализации функции уже существует на этом языке. Указатель на элемент a-data-of-a-member ничем не отличается от указателя на непосредственный элемент данных. Единственное, чего не хватает, это синтаксис для инициализации такого указателя. Однако комитет, по-видимому, не заинтересован в введении такого синтаксиса.
С чистой формальной логической точки зрения это должно было быть разрешено в C ++
struct Inner {
int i;
int j[10];
};
struct Outer {
int i;
int j[10];
Inner inner;
};
Outer o;
int Outer::*p;
p = &Outer::i; // OK
o.*p = 0; // sets `o.i` to 0
p = &Outer::inner.i; // ERROR, but should have been supported
o.*p = 0; // sets `o.inner.i` to 0
p = &Outer::j[0]; // ERROR, but should have been supported
o.*p = 0; // sets `o.j[0]` to 0
// This could have been used to implement something akin to "array type decay"
// for member pointers
p = &Outer::j[3]; // ERROR, but should have been supported
o.*p = 0; // sets `o.j[3]` to 0
p = &Outer::inner.j[5]; // ERROR, but should have been supported
o.*p = 0; // sets `o.inner.j[5]` to 0
. Типичная реализация элемента-указателя-данных - это не что иное, как просто байт-смещение члена от начала окружающего объекта. Поскольку все члены (непосредственные члены и члены членов) в конечном итоге последовательно выкладываются в памяти, члены членов также могут быть идентифицированы с помощью определенного значения смещения. Это то, что я имею в виду, когда говорю, что внутренняя работа этой функции уже полностью реализована, все, что необходимо, - это синтаксис инициализации.
На языке C эта функция эмулируется явными смещениями, полученными с помощью стандартного offsetof
макрос. А в C я могу получить offsetof(Outer, inner.i)
и offsetof(Outer, j[2])
. К сожалению, эта возможность не отражается в C ++ указателях на данные.
Все, что вам нужно сделать, это добавить вызов select
в функцию карты, например, так:
jq 'map(select(.website_ids.item[] | contains("4")))'
После редактирования это немного сложнее, но его можно обойти, проверив тип .website_ids.item
и затем основанный на этом типе, выполняющий проверку содержимого или простую проверку на равенство:
map((select((.website_ids.item | type) == "array") | select(.website_ids.item[] | contains("4"))), (select((.website_ids.item | type) == "string") | select (.website_ids.item == "4")))
Здесь он отформатирован немного более читабельно:
map(
(select((.website_ids.item | type) == "array") | select(.website_ids.item[] | contains("4"))),
(select((.website_ids.item | type) == "string") | select (.website_ids.item == "4"))
)