Thanks for responding. I can certainly add VisitBuilder/VisitBuilderInline for ArrayBuilder, but there's a slight difficulty: some types don't have a single concrete builder class. For example, the builders of dictionary arrays are templated on the encoded type and also on an index builder, which is either adaptive or fixed at int32. I can make this transparent in the definition of VisitBuilder so that one can add Visit(StringDictionaryBuilder*) and Visit(DictionaryBuilder<Int64Type>*). Something similar is already required for IntervalType, which may be MonthIntervalType or DayTimeIntervalType depending on the value of IntervalType::interval_type().
Another difficulty is the adaptive builders. Whatever they return for ArrayBuilder::type()/type_id()/..., it won't help to discriminate them from the non adaptive builders. Is there any application which uses the adaptive builders except the dictionary builders? If possible, I think it would be simplest to make their inheritance of ArrayBuilder protected. Ben