diff --git a/docs/source/CppUsage.md b/docs/source/CppUsage.md index 647ab6362..6cf36d1fa 100644 --- a/docs/source/CppUsage.md +++ b/docs/source/CppUsage.md @@ -270,8 +270,8 @@ custom string types; the `--cpp-str-flex-ctor` argument to `flatc` or the per field attribute `cpp_str_flex_ctor` can be used to change this behavior, so that the custom string type is constructed by passing the pointer and length of the FlatBuffers String. The custom string class will require a -constructor in the following format: custom_str_class(const char *, uint32_t). -Please note that the character array is not guaranteed to be NUL terminated, +constructor in the following format: custom_str_class(const char *, size_t). +Please note that the character array is not guaranteed to be NULL terminated, you should always use the provided size to determine end of string. ## Reflection (& Resizing) diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index b79c7f219..534e8993b 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -496,13 +496,13 @@ class CppGenerator : public BaseGenerator { // Return a C++ type from the table in idl.h std::string GenTypeBasic(const Type &type, bool user_facing_type) const { static const char *const ctypename[] = { -// clang-format off + // clang-format off #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, \ RTYPE) \ #CTYPE, FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) #undef FLATBUFFERS_TD - // clang-format on + // clang-format on }; if (user_facing_type) { if (type.enum_def) return WrapInNameSpace(*type.enum_def); @@ -581,7 +581,7 @@ class CppGenerator : public BaseGenerator { bool FlexibleStringConstructor(const FieldDef *field) { auto attr = field ? (field->attributes.Lookup("cpp_str_flex_ctor") != nullptr) : false; auto ret = attr ? attr : parser_.opts.cpp_object_api_string_flexible_constructor; - return (ret && NativeString(field) != "std::string"); // Only for custom string types. + return ret && NativeString(field) != "std::string"; // Only for custom string types. } std::string GenTypeNativePtr(const std::string &type, const FieldDef *field, @@ -2341,13 +2341,17 @@ class CppGenerator : public BaseGenerator { auto vector_type = field.value.type.VectorType(); switch (vector_type.base_type) { case BASE_TYPE_STRING: { - // Use by-function serialization to emulate CreateVectorOfStrings(); - // this works also with non-std strings. - code += "_fbb.CreateVector> "; - code += "(" + value + ".size(), "; - code += "[](size_t i, _VectorArgs *__va) { "; - code += "return __va->__fbb->CreateString(__va->_" + value + "[i]);"; - code += " }, &_va )"; + if (NativeString(&field) == "std::string") { + code += "_fbb.CreateVectorOfStrings(" + value + ")"; + } else { + // Use by-function serialization to emulate CreateVectorOfStrings(); + // this works also with non-std strings. + code += "_fbb.CreateVector> "; + code += "(" + value + ".size(), "; + code += "[](size_t i, _VectorArgs *__va) { "; + code += "return __va->__fbb->CreateString(__va->_" + value + "[i]);"; + code += " }, &_va )"; + } break; } case BASE_TYPE_STRUCT: {