@@ -112,7 +112,7 @@ class BehaviorTreeFactory
112
112
constexpr bool param_constructable =
113
113
std::is_constructible<T, const std::string&, const NodeParameters&>::value;
114
114
constexpr bool has_static_required_parameters =
115
- has_static_method_requiredNodeParameters <T>::value;
115
+ has_static_method_requiredParams <T>::value;
116
116
117
117
static_assert (default_constructable || param_constructable,
118
118
" [registerBuilder]: the registered class must have at least one of these two "
@@ -154,57 +154,55 @@ class BehaviorTreeFactory
154
154
using has_params_constructor = typename std::is_constructible<T, const std::string&, const NodeParameters&>;
155
155
156
156
template <typename T, typename = void >
157
- struct has_static_method_requiredNodeParameters : std::false_type {};
157
+ struct has_static_method_requiredParams : std::false_type {};
158
158
159
159
template <typename T>
160
- struct has_static_method_requiredNodeParameters <T,
160
+ struct has_static_method_requiredParams <T,
161
161
typename std::enable_if<std::is_same<decltype (T::requiredNodeParameters()), const NodeParameters&>::value>::type>
162
162
: std::true_type {};
163
163
164
164
template <typename T>
165
- typename std::enable_if< has_default_constructor<T>::value && !has_params_constructor<T>::value>::type
166
- registerNodeTypeImpl (const std::string& ID)
165
+ void registerNodeTypeImpl (const std::string& ID)
167
166
{
168
- NodeBuilder builder = [](const std::string& name, const NodeParameters&)
169
- {
170
- return std::unique_ptr<TreeNode>(new T (name));
171
- };
172
- TreeNodeManifest manifest = { NodeType::ACTION, ID, NodeParameters () };
167
+ NodeBuilder builder = getBuilderImpl<T>();
168
+ TreeNodeManifest manifest = { getType<T>(), ID,
169
+ getRequiredParamsImpl<T>() };
173
170
registerBuilder (manifest, builder);
174
171
}
175
172
176
173
template <typename T>
177
- typename std::enable_if< !has_default_constructor<T>::value && has_params_constructor<T>::value>::type
178
- registerNodeTypeImpl (const std::string& ID)
174
+ NodeBuilder getBuilderImpl (typename std::enable_if< !has_params_constructor<T>::value >::type* = nullptr )
179
175
{
180
- NodeBuilder builder = [](const std::string& name, const NodeParameters& params )
176
+ return [](const std::string& name, const NodeParameters&)
181
177
{
182
- return std::unique_ptr<TreeNode>(new T (name, params ));
178
+ return std::unique_ptr<TreeNode>(new T (name));
183
179
};
184
- TreeNodeManifest manifest = { getType<T>(), ID, T::requiredNodeParameters () };
185
- registerBuilder (manifest, builder);
186
180
}
187
181
188
182
template <typename T>
189
- typename std::enable_if< has_default_constructor<T>::value && has_params_constructor<T>::value>::type
190
- registerNodeTypeImpl (const std::string& ID)
183
+ NodeBuilder getBuilderImpl (typename std::enable_if< has_params_constructor<T>::value >::type* = nullptr )
191
184
{
192
- NodeBuilder builder = [](const std::string& name, const NodeParameters& params)
185
+ return [](const std::string& name, const NodeParameters& params)
193
186
{
194
- if ( params.empty () )
195
- {
196
- // call this one that MIGHT use default initialization
197
- return std::unique_ptr<TreeNode>(new T (name));
198
- }
199
187
return std::unique_ptr<TreeNode>(new T (name, params));
200
188
};
201
- TreeNodeManifest manifest = { getType<T>(), ID, T::requiredNodeParameters () };
202
- registerBuilder (manifest, builder);
203
189
}
204
190
205
- void sortTreeNodeManifests ();
191
+ template <typename T>
192
+ NodeParameters getRequiredParamsImpl (typename std::enable_if< has_static_method_requiredParams<T>::value >::type* = nullptr )
193
+ {
194
+ return T::requiredNodeParameters ();
195
+ }
206
196
197
+ template <typename T>
198
+ NodeParameters getRequiredParamsImpl (typename std::enable_if< !has_static_method_requiredParams<T>::value >::type* = nullptr )
199
+ {
200
+ return NodeParameters ();
201
+ }
207
202
// clang-format on
203
+
204
+ void sortTreeNodeManifests ();
205
+
208
206
};
209
207
210
208
} // end namespace
0 commit comments