Skip to content

Commit 640df2c

Browse files
committed
Allow Set() methods to handle reference types
Change-Id: I487ded77d28490189dd5d38236cb04bffaf5f11a
1 parent 60340ac commit 640df2c

File tree

3 files changed

+12
-13
lines changed

3 files changed

+12
-13
lines changed

samples/monster_generated.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,12 @@ struct EquipmentUnion {
119119
void Reset();
120120

121121
#ifndef FLATBUFFERS_CPP98_STL
122-
template <typename T>
122+
template <typename T, typename RT = typename std::remove_reference<T>::type>
123123
void Set(T&& val) {
124124
Reset();
125-
type = EquipmentTraits<typename T::TableType>::enum_value;
125+
type = EquipmentTraits<typename RT::TableType>::enum_value;
126126
if (type != Equipment_NONE) {
127-
value = new T(std::forward<T>(val));
127+
value = new RT(std::forward<T>(val));
128128
}
129129
}
130130
#endif // FLATBUFFERS_CPP98_STL

src/idl_gen_cpp.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,13 +1096,12 @@ class CppGenerator : public BaseGenerator {
10961096
code_ += "";
10971097
if (!enum_def.uses_multiple_type_instances) {
10981098
code_ += "#ifndef FLATBUFFERS_CPP98_STL";
1099-
code_ += " template <typename T>";
1099+
code_ += " template <typename T, typename RT = typename std::remove_reference<T>::type>";
11001100
code_ += " void Set(T&& val) {";
11011101
code_ += " Reset();";
1102-
code_ +=
1103-
" type = {{NAME}}Traits<typename T::TableType>::enum_value;";
1102+
code_ += " type = {{NAME}}Traits<typename RT::TableType>::enum_value;";
11041103
code_ += " if (type != {{NONE}}) {";
1105-
code_ += " value = new T(std::forward<T>(val));";
1104+
code_ += " value = new RT(std::forward<T>(val));";
11061105
code_ += " }";
11071106
code_ += " }";
11081107
code_ += "#endif // FLATBUFFERS_CPP98_STL";

tests/monster_test_generated.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,12 @@ struct AnyUnion {
207207
void Reset();
208208

209209
#ifndef FLATBUFFERS_CPP98_STL
210-
template <typename T>
210+
template <typename T, typename RT = typename std::remove_reference<T>::type>
211211
void Set(T&& val) {
212212
Reset();
213-
type = AnyTraits<typename T::TableType>::enum_value;
213+
type = AnyTraits<typename RT::TableType>::enum_value;
214214
if (type != Any_NONE) {
215-
value = new T(std::forward<T>(val));
215+
value = new RT(std::forward<T>(val));
216216
}
217217
}
218218
#endif // FLATBUFFERS_CPP98_STL
@@ -348,12 +348,12 @@ struct AnyUniqueAliasesUnion {
348348
void Reset();
349349

350350
#ifndef FLATBUFFERS_CPP98_STL
351-
template <typename T>
351+
template <typename T, typename RT = typename std::remove_reference<T>::type>
352352
void Set(T&& val) {
353353
Reset();
354-
type = AnyUniqueAliasesTraits<typename T::TableType>::enum_value;
354+
type = AnyUniqueAliasesTraits<typename RT::TableType>::enum_value;
355355
if (type != AnyUniqueAliases_NONE) {
356-
value = new T(std::forward<T>(val));
356+
value = new RT(std::forward<T>(val));
357357
}
358358
}
359359
#endif // FLATBUFFERS_CPP98_STL

0 commit comments

Comments
 (0)