Every method here addresses members by name and skips disabled members.

MemberBehaviour
size() → std::size_tactive member count
empty() → bool
contains(name) → bool
find(name) → Value*nullptr when no active member has this name (const overload → Value const*)
at(name) → Value&throws std::out_of_range when absent
set(Key, value) → Value&replaces the active member's value, or appends a new member; returns the stored value
set(name, value) → Value&string overload: bare key when name is grammar-valid, quoted otherwise
remove(name) → boolremoves the active member; false when absent

set never touches a disabled member — a new active member is appended beside it.

Object& db = *doc.getRootObject()->find( "database" )->asObject();

db.contains( "host" );                                   // true
db.at( "port" ).asNumber()->asInteger();                 // 5432
db.set( "host", std::make_unique<String>( "db1" ) );     // replace
db.set( "pool_size", std::make_unique<Number>( 8LL ) );  // append (bare key)
db.remove( "user" );

To iterate, use the member API and skip isDisabled() members — there is no indexed active-member accessor.