Allow Set() methods to handle reference types

Change-Id: I487ded77d28490189dd5d38236cb04bffaf5f11a
This commit is contained in:
Wouter van Oortmerssen
2019-04-11 14:18:21 -07:00
parent 60340ac529
commit 640df2c1f5
3 changed files with 12 additions and 13 deletions

View File

@@ -119,12 +119,12 @@ struct EquipmentUnion {
void Reset();
#ifndef FLATBUFFERS_CPP98_STL
template <typename T>
template <typename T, typename RT = typename std::remove_reference<T>::type>
void Set(T&& val) {
Reset();
type = EquipmentTraits<typename T::TableType>::enum_value;
type = EquipmentTraits<typename RT::TableType>::enum_value;
if (type != Equipment_NONE) {
value = new T(std::forward<T>(val));
value = new RT(std::forward<T>(val));
}
}
#endif // FLATBUFFERS_CPP98_STL

View File

@@ -1096,13 +1096,12 @@ class CppGenerator : public BaseGenerator {
code_ += "";
if (!enum_def.uses_multiple_type_instances) {
code_ += "#ifndef FLATBUFFERS_CPP98_STL";
code_ += " template <typename T>";
code_ += " template <typename T, typename RT = typename std::remove_reference<T>::type>";
code_ += " void Set(T&& val) {";
code_ += " Reset();";
code_ +=
" type = {{NAME}}Traits<typename T::TableType>::enum_value;";
code_ += " type = {{NAME}}Traits<typename RT::TableType>::enum_value;";
code_ += " if (type != {{NONE}}) {";
code_ += " value = new T(std::forward<T>(val));";
code_ += " value = new RT(std::forward<T>(val));";
code_ += " }";
code_ += " }";
code_ += "#endif // FLATBUFFERS_CPP98_STL";

View File

@@ -207,12 +207,12 @@ struct AnyUnion {
void Reset();
#ifndef FLATBUFFERS_CPP98_STL
template <typename T>
template <typename T, typename RT = typename std::remove_reference<T>::type>
void Set(T&& val) {
Reset();
type = AnyTraits<typename T::TableType>::enum_value;
type = AnyTraits<typename RT::TableType>::enum_value;
if (type != Any_NONE) {
value = new T(std::forward<T>(val));
value = new RT(std::forward<T>(val));
}
}
#endif // FLATBUFFERS_CPP98_STL
@@ -348,12 +348,12 @@ struct AnyUniqueAliasesUnion {
void Reset();
#ifndef FLATBUFFERS_CPP98_STL
template <typename T>
template <typename T, typename RT = typename std::remove_reference<T>::type>
void Set(T&& val) {
Reset();
type = AnyUniqueAliasesTraits<typename T::TableType>::enum_value;
type = AnyUniqueAliasesTraits<typename RT::TableType>::enum_value;
if (type != AnyUniqueAliases_NONE) {
value = new T(std::forward<T>(val));
value = new RT(std::forward<T>(val));
}
}
#endif // FLATBUFFERS_CPP98_STL