From 640df2c1f572ddcbab036c94609fd33ab21bab64 Mon Sep 17 00:00:00 2001 From: Wouter van Oortmerssen Date: Thu, 11 Apr 2019 14:18:21 -0700 Subject: [PATCH] Allow Set() methods to handle reference types Change-Id: I487ded77d28490189dd5d38236cb04bffaf5f11a --- samples/monster_generated.h | 6 +++--- src/idl_gen_cpp.cpp | 7 +++---- tests/monster_test_generated.h | 12 ++++++------ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/samples/monster_generated.h b/samples/monster_generated.h index e89ec3a51..d9d64793d 100644 --- a/samples/monster_generated.h +++ b/samples/monster_generated.h @@ -119,12 +119,12 @@ struct EquipmentUnion { void Reset(); #ifndef FLATBUFFERS_CPP98_STL - template + template ::type> void Set(T&& val) { Reset(); - type = EquipmentTraits::enum_value; + type = EquipmentTraits::enum_value; if (type != Equipment_NONE) { - value = new T(std::forward(val)); + value = new RT(std::forward(val)); } } #endif // FLATBUFFERS_CPP98_STL diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index 17da0693e..0c964d4bc 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -1096,13 +1096,12 @@ class CppGenerator : public BaseGenerator { code_ += ""; if (!enum_def.uses_multiple_type_instances) { code_ += "#ifndef FLATBUFFERS_CPP98_STL"; - code_ += " template "; + code_ += " template ::type>"; code_ += " void Set(T&& val) {"; code_ += " Reset();"; - code_ += - " type = {{NAME}}Traits::enum_value;"; + code_ += " type = {{NAME}}Traits::enum_value;"; code_ += " if (type != {{NONE}}) {"; - code_ += " value = new T(std::forward(val));"; + code_ += " value = new RT(std::forward(val));"; code_ += " }"; code_ += " }"; code_ += "#endif // FLATBUFFERS_CPP98_STL"; diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h index f98e86b71..a55a42754 100644 --- a/tests/monster_test_generated.h +++ b/tests/monster_test_generated.h @@ -207,12 +207,12 @@ struct AnyUnion { void Reset(); #ifndef FLATBUFFERS_CPP98_STL - template + template ::type> void Set(T&& val) { Reset(); - type = AnyTraits::enum_value; + type = AnyTraits::enum_value; if (type != Any_NONE) { - value = new T(std::forward(val)); + value = new RT(std::forward(val)); } } #endif // FLATBUFFERS_CPP98_STL @@ -348,12 +348,12 @@ struct AnyUniqueAliasesUnion { void Reset(); #ifndef FLATBUFFERS_CPP98_STL - template + template ::type> void Set(T&& val) { Reset(); - type = AnyUniqueAliasesTraits::enum_value; + type = AnyUniqueAliasesTraits::enum_value; if (type != AnyUniqueAliases_NONE) { - value = new T(std::forward(val)); + value = new RT(std::forward(val)); } } #endif // FLATBUFFERS_CPP98_STL