31#ifndef DW_FRAMEWORK_PARAMETERDESCRIPTOR_HPP_
32#define DW_FRAMEWORK_PARAMETERDESCRIPTOR_HPP_
36#include <dwshared/dwfoundation/dw/core/container/StringView.hpp>
37#include <dwshared/dwfoundation/dw/core/language/Optional.hpp>
38#include <dwshared/dwfoundation/dw/core/language/Tuple.hpp>
46template <
typename ConstructorArgumentT,
typename ParameterDescriptorsT>
69 return std::make_tuple();
79template <
typename Arg1>
84 return std::make_tuple(std::forward<Arg1>(arg1));
95 typename Arg1,
typename... ArgRest,
96 typename std::enable_if_t<
sizeof...(ArgRest) != 0>* =
nullptr>
102 return std::tuple_cat(
103 describeConstructorArguments<Arg1>(std::forward<Arg1>(arg1)),
104 describeConstructorArguments<ArgRest...>(std::forward<ArgRest>(argRest)...));
113template <
typename ConstructorArgumentT,
typename... Args>
118 dw::core::make_tuple<
const Args...>(std::forward<const Args>(args)...));
122template <
typename Type_,
typename SemanticType_,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
bool HasDefault,
typename... MemberPointers>
140 constexpr ParameterDescriptorT(dw::core::StringView&& typeName_, dw::core::StringView&& parameterName_,
const MemberPointers&&... memberPointers_)
143 ,
memberPointers(std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers_)...))
148template <
typename Type_,
typename SemanticType_,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
bool HasDefault,
typename... MemberPointers>
149constexpr bool ParameterDescriptorT<Type_, SemanticType_, IsIndex, ArraySize, IsAbstract, HasDefault, MemberPointers...>::IS_INDEX;
151template <
typename Type_,
typename SemanticType_,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
bool HasDefault,
typename... MemberPointers>
152constexpr size_t ParameterDescriptorT<Type_, SemanticType_, IsIndex, ArraySize, IsAbstract, HasDefault, MemberPointers...>::ARRAY_SIZE;
154template <
typename Type_,
typename SemanticType_,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
bool HasDefault,
typename... MemberPointers>
155constexpr bool ParameterDescriptorT<Type_, SemanticType_, IsIndex, ArraySize, IsAbstract, HasDefault, MemberPointers...>::HAS_DEFAULT;
158template <
typename Type,
typename SemanticType,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
typename DefaultType,
typename... MemberPointers>
163 constexpr ParameterDescriptorWithDefaultT(dw::core::StringView&& typeName_, dw::core::StringView&& parameterName_, DefaultType&& defaultValue_,
const MemberPointers&&... memberPointers_)
164 :
ParameterDescriptorT<
Type,
SemanticType, IsIndex, ArraySize, IsAbstract, true, MemberPointers...>{std::move(typeName_), std::move(parameterName_), std::forward<const MemberPointers>(memberPointers_)...}
173#define DW_PARAMETER_TYPE_NAME_STRING_VIEW_IMPL(TYPE_NAME_STR) \
174 dw::core::StringView { TYPE_NAME_STR }
175#define DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME) DW_PARAMETER_TYPE_NAME_STRING_VIEW_IMPL(#TYPE_NAME)
176#define DW_DESCRIBE_PARAMETER(TYPE_NAME, args...) dw::framework::describeParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
177#define DW_DESCRIBE_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, args...) dw::framework::describeParameter<TYPE_NAME, SEMANTIC_TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
192template <
typename T,
typename S,
typename... MemberPointers>
195 dw::core::StringView&& typeName, dw::core::StringView&& parameterName,
const MemberPointers&&... memberPointers) ->
ParameterDescriptorT<T, S,
false, 0,
false,
false, MemberPointers...>
199 std::move(parameterName),
200 std::forward<const MemberPointers>(memberPointers)...);
206#define DW_DESCRIBE_ABSTRACT_PARAMETER(TYPE_NAME, args...) dw::framework::describeAbstractParameter<TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
207#define DW_DESCRIBE_ABSTRACT_ARRAY_PARAMETER(TYPE_NAME, PARAM_NAME, ARRAY_SIZE, args...) dw::framework::describeAbstractArrayParameter<TYPE_NAME, ARRAY_SIZE>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), PARAM_NAME, ##args)
221 dw::core::StringView&& typeName, dw::core::StringView&& parameterName)
225 std::move(parameterName));
233template <
typename T,
size_t ArraySize>
235 dw::core::StringView&& typeName, dw::core::StringView&& parameterName)
239 std::move(parameterName));
245#define DW_DESCRIBE_INDEX_PARAMETER(TYPE_NAME, args...) dw::framework::describeIndexParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
246#define DW_DESCRIBE_INDEX_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, args...) dw::framework::describeIndexParameter<TYPE_NAME, SEMANTIC_TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
259template <
typename T,
typename S,
typename... MemberPointers>
261 dw::core::StringView&& typeName, dw::core::StringView&& parameterName,
const MemberPointers&&... memberPointers)
265 std::move(parameterName),
266 std::forward<const MemberPointers>(memberPointers)...);
272#define DW_DESCRIBE_ARRAY_PARAMETER(TYPE_NAME, PARAM_NAME, ARRAY_SIZE, args...) dw::framework::describeArrayParameter<TYPE_NAME, TYPE_NAME, ARRAY_SIZE>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), PARAM_NAME, ##args)
273#define DW_DESCRIBE_ARRAY_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, PARAM_NAME, ARRAY_SIZE, args...) dw::framework::describeArrayParameter<TYPE_NAME, SEMANTIC_TYPE_NAME, ARRAY_SIZE>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), PARAM_NAME, ##args)
285template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
287 dw::core::StringView&& typeName, dw::core::StringView&& parameterName,
const MemberPointers&&... memberPointers)
291 std::move(parameterName),
292 std::forward<const MemberPointers>(memberPointers)...);
298#define DW_DESCRIBE_UNNAMED_PARAMETER(TYPE_NAME, args...) dw::framework::describeUnnamedParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
299#define DW_DESCRIBE_UNNAMED_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, args...) dw::framework::describeUnnamedParameter<TYPE_NAME, SEMANTIC_TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
312template <
typename T,
typename S,
typename... MemberPointers>
315 dw::core::StringView&& typeName,
const MemberPointers&&... memberPointers) ->
ParameterDescriptorT<T, S,
false, 0,
false,
false, MemberPointers...>
321 dw::core::StringView{
""},
322 std::forward<const MemberPointers>(memberPointers)...);
328#define DW_DESCRIBE_UNNAMED_ARRAY_PARAMETER(TYPE_NAME, ARRAY_SIZE, args...) dw::framework::describeUnnamedArrayParameter<TYPE_NAME, TYPE_NAME, ARRAY_SIZE>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
329#define DW_DESCRIBE_UNNAMED_ARRAY_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, ARRAY_SIZE, args...) dw::framework::describeUnnamedArrayParameter<TYPE_NAME, SEMANTIC_TYPE_NAME, ARRAY_SIZE>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
342template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
344 dw::core::StringView&& typeName,
const MemberPointers&&... memberPointers)
346 return describeArrayParameter<T, S, ArraySize>(
349 std::forward<const MemberPointers>(memberPointers)...);
355#define DW_DESCRIBE_PARAMETER_WITH_DEFAULT(TYPE_NAME, args...) dw::framework::describeParameterWithDefault<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
367template <
typename T,
typename S,
typename... MemberPointers>
370 dw::core::StringView&& typeName, dw::core::StringView&& parameterName, T&& defaultValue,
const MemberPointers&&... memberPointers) ->
ParameterDescriptorWithDefaultT<T, S,
false, 0,
false, T, MemberPointers...>
374 std::move(parameterName),
375 std::move(defaultValue),
376 std::forward<const MemberPointers>(memberPointers)...);
382#define DW_DESCRIBE_ARRAY_PARAMETER_WITH_DEFAULT(TYPE_NAME, args...) dw::framework::describeArrayParameterWithDefault<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
394template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
396 dw::core::StringView&& typeName, dw::core::StringView&& parameterName, std::array<T, ArraySize> defaultValue,
const MemberPointers&&... memberPointers)
400 std::move(parameterName),
401 std::move(defaultValue),
402 std::forward<const MemberPointers>(memberPointers)...);
406template <
typename NodeT>
411 return NodeT::describeParameters();
419 typename Param,
typename MemberPtr,
420 typename std::enable_if_t<!Param::HAS_DEFAULT, void>* =
nullptr>
422void populateDefault(
const Param& param, MemberPtr& memberPtr)
424 static_cast<void>(param);
425 static_cast<void>(memberPtr);
430 typename Param,
typename MemberPtr,
431 typename std::enable_if_t<Param::HAS_DEFAULT, void>* =
nullptr>
433void populateDefault(
const Param& param, MemberPtr& memberPtr)
435 memberPtr = param.defaultValue;
440 typename Param,
typename MemberPtr,
441 typename std::enable_if_t<!Param::HAS_DEFAULT, void>* =
nullptr>
443void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
445 static_cast<void>(param);
446 static_cast<void>(memberPtr);
447 static_cast<void>(index);
452 typename Param,
typename MemberPtr,
453 typename std::enable_if_t<Param::HAS_DEFAULT, void>* =
nullptr>
455void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
457 memberPtr[index] = param.defaultValue[index];
462 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
463 typename std::enable_if_t<std::tuple_size<MemberPtrs>() == 0,
void>* =
nullptr>
465auto getMemberPtr(ArgType& arg, MemberPtrs memberPtrs) -> ArgType&
467 static_cast<void>(memberPtrs);
473 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
474 typename std::enable_if_t<MemberIndex + 1 == std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
477auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
480 auto member = std::get<MemberIndex>(memberPtrs);
486 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
487 typename std::enable_if_t<MemberIndex + 1 < std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
489auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
491 auto& member = std::get<MemberIndex>(memberPtrs);
492 auto& m = arg.*member;
493 return getMemberPtr<MemberIndex + 1>(m, memberPtrs);
497template <
typename NodeT,
size_t ConstructorParameterIndex>
499constexpr size_t constructorArgumentParameterSize()
501 using ConstructorArgumentDescriptor = std::tuple_element_t<ConstructorParameterIndex, decltype(describeNodeParameters<NodeT>())>;
503 return dw::core::tuple_size<typename ConstructorArgumentDescriptor::ParameterDescriptorsType>();
507template <
typename ParamT>
509constexpr bool isIndexParameter()
511 return ParamT::IS_INDEX;
515template <
typename ParamT>
517constexpr bool isArrayParameter()
520 return ParamT::ARRAY_SIZE > 0U;
524template <
typename ParamT>
526constexpr bool isAbstractParameter()
528 return ParamT::IS_ABSTRACT;
533 typename ArgType,
typename ParamT,
534 typename std::enable_if_t<isAbstractParameter<ParamT>(),
void>* =
nullptr>
536void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
538 static_cast<void>(provider);
539 static_cast<void>(arg);
540 static_cast<void>(param);
549 typename ArgType,
typename ParamT,
550 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && !isIndexParameter<ParamT>(),
void>* =
nullptr>
552void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
554 using DataType =
typename ParamT::Type;
555 using SemanticDataType =
typename ParamT::SemanticType;
556 DataType& memberPtr{getMemberPtr<0>(arg, param.memberPointers)};
557 bool hadParameter{provider.getOptional<SemanticDataType, DataType>(param.parameterName, &memberPtr)};
560 populateDefault(param, memberPtr);
570 typename ArgType,
typename ParamT,
571 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && isIndexParameter<ParamT>(),
void>* =
nullptr>
573void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
575 using DataType =
typename ParamT::Type;
576 using SemanticDataType =
typename ParamT::SemanticType;
577 DataType& memberPtr = getMemberPtr<0>(arg, param.memberPointers);
579 size_t index =
static_cast<size_t>(-1);
580 bool hadParameter = provider.getOptional<size_t,
size_t>(param.parameterName, &index);
583 hadParameter = provider.getOptional<SemanticDataType, DataType>(
"", index, &memberPtr);
587 populateDefault(param, memberPtr);
597 typename ArgType,
typename ParamT,
598 typename std::enable_if_t<!isAbstractParameter<ParamT>() && isArrayParameter<ParamT>(),
void>* =
nullptr>
600void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
602 using DataType =
typename ParamT::Type;
603 using SemanticDataType =
typename ParamT::SemanticType;
605 constexpr size_t arraySize = ParamT::ARRAY_SIZE;
607 DataType(&memberPtr)[arraySize] = getMemberPtr<0>(arg, param.memberPointers);
608 for (
size_t i = 0; i < arraySize; ++i)
610 bool hadParameter = provider.getOptional<SemanticDataType, DataType>(param.parameterName, i, &memberPtr[i]);
613 populateArrayDefault(param, memberPtr, i);
619template <
typename ArgType>
621void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg,
const dw::core::Tuple<>& t)
623 static_cast<void>(provider);
624 static_cast<void>(arg);
625 static_cast<void>(t);
629template <
typename ArgType,
typename THead>
631void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg,
const dw::core::Tuple<THead>& t)
633 populateParameter(provider, arg, t.m_head);
638 typename ArgType,
typename THead,
typename... TTail,
639 typename std::enable_if_t<
sizeof...(TTail) != 0>* =
nullptr>
641void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg,
const dw::core::Tuple<THead, TTail...>& t)
643 populateParameter(provider, arg, t.m_head);
644 populateParametersRecursion(provider, arg, t.m_tail);
652template <
typename NodeT,
size_t ConstructorParameterIndex,
typename ConstructorArgsType>
654void populateParameters(
const ParameterProvider& provider, ConstructorArgsType& constructorArguments)
659 auto& arg = std::get<ConstructorParameterIndex>(constructorArguments);
661 constexpr auto params = std::get<ConstructorParameterIndex>(describeNodeParameters<NodeT>()).parameterDescriptors;
663 populateParametersRecursion(provider, arg, params);
665 catch (ExceptionWithStatus& e)
667 throw ExceptionWithStatus(e.statusCode(),
"Exception while populating parameters of mangled node type ",
typeid(NodeT).name(),
": ", e.message());
672template <
typename NodeT,
size_t ConstructorParameterIndex,
typename ConstructorArgsType>
674void* populateParametersWithNonVoidReturnType(
const ParameterProvider& provider, ConstructorArgsType& constructorArguments)
676 populateParameters<NodeT, ConstructorParameterIndex>(provider, constructorArguments);
681 typename NodeT,
typename ConstructorArguments,
size_t... Is>
683void populateParametersForEachConstructorArgument(
const ParameterProvider& provider, ConstructorArguments& constructorArguments, std::integer_sequence<size_t, Is...>)
686 populateParametersWithNonVoidReturnType<NodeT, Is>(provider, constructorArguments)...};
687 static_cast<void>(forEach);
693template <
typename NodeT,
typename... Ts>
697 detail::populateParametersForEachConstructorArgument<NodeT>(provider, constructorArguments, std::make_index_sequence<
sizeof...(Ts)>());
704template <
typename NodeT>
706constexpr std::size_t parameterConstructorArgumentSize()
708 return std::tuple_size<decltype(describeNodeParameters<NodeT>())>::value;
713 typename NodeT,
size_t ConstructorArgumentIndex,
714 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
718 return std::make_tuple();
723 typename NodeT,
size_t ConstructorArgumentIndex,
724 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
729 using NodeParams =
decltype(describeNodeParameters<NodeT>());
731 using ConstructorArgumentDescriptor = std::tuple_element_t<ConstructorArgumentIndex, NodeParams>;
732 typename ConstructorArgumentDescriptor::ConstructorArgumentType arg{};
734 return std::tuple_cat(std::make_tuple(arg), createConstructorArguments<NodeT, ConstructorArgumentIndex + 1>());
740template <
typename NodeT>
745 return detail::createConstructorArguments<NodeT, 0>();
752template <
class T,
class Tuple,
size_t... Is>
757 return std::make_unique<T>(std::get<Is>(std::move(tuple))...);
762template <
typename NodeT,
class ConstructorArguments>
766 return detail::makeUniqueFromTuple<NodeT>(
767 std::move(constructorArguments),
768 std::make_index_sequence<std::tuple_size<std::decay_t<ConstructorArguments>>::value>{});
779template <
typename NodeT>
784 auto constructorArguments = createConstructorArguments<NodeT>();
785 populateParameters<NodeT>(constructorArguments, provider);
786 return makeUniqueFromTuple<NodeT>(std::move(constructorArguments));
795 typename NodeT,
size_t ConstructorArgumentIndex,
796 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
806 typename NodeT,
size_t ConstructorArgumentIndex,
807 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
811 return constructorArgumentParameterSize<NodeT, ConstructorArgumentIndex>() + parameterSize<NodeT, ConstructorArgumentIndex + 1>();
817template <
typename NodeT>
821 return detail::parameterSize<NodeT, 0>();
The interface to access parameter values identified by name and/or (semantic) type.
auto makeUniqueFromTuple(ConstructorArguments &&constructorArguments) -> std::unique_ptr< NodeT >
Instantiate a node using the passed constructor arguments.
constexpr auto describeUnnamedParameter(dw::core::StringView &&typeName, const MemberPointers &&... memberPointers) -> ParameterDescriptorT< T, S, false, 0, false, false, MemberPointers... >
constexpr auto describeAbstractArrayParameter(dw::core::StringView &&typeName, dw::core::StringView &¶meterName)
constexpr std::tuple describeConstructorArguments()
constexpr auto describeParameter(dw::core::StringView &&typeName, dw::core::StringView &¶meterName, const MemberPointers &&... memberPointers) -> ParameterDescriptorT< T, S, false, 0, false, false, MemberPointers... >
constexpr auto describeAbstractParameter(dw::core::StringView &&typeName, dw::core::StringView &¶meterName)
constexpr auto describeUnnamedArrayParameter(dw::core::StringView &&typeName, const MemberPointers &&... memberPointers)
auto createConstructorArguments()
Create a tuple of constructor argument needed by the constructor of the passed node.
std::unique_ptr< Node > createNode(const dw::core::StringView &className, ParameterProvider &provider)
constexpr auto describeNodeParameters()
Get described parameters for the passed node.
void populateParameters(std::tuple< Ts... > &constructorArguments, const ParameterProvider &provider)
Populate the constructor arguments using values from the parameter provider.
constexpr std::size_t parameterSize()
Get the number of parameters for a given node.
constexpr auto describeParameterWithDefault(dw::core::StringView &&typeName, dw::core::StringView &¶meterName, T &&defaultValue, const MemberPointers &&... memberPointers) -> ParameterDescriptorWithDefaultT< T, S, false, 0, false, T, MemberPointers... >
constexpr auto describeConstructorArgument(const Args &&... args) -> ConstructorArgumentDescriptorT< ConstructorArgumentT, dw::core::Tuple< Args... > >
constexpr auto describeArrayParameter(dw::core::StringView &&typeName, dw::core::StringView &¶meterName, const MemberPointers &&... memberPointers)
constexpr auto describeIndexParameter(dw::core::StringView &&typeName, dw::core::StringView &¶meterName, const MemberPointers &&... memberPointers)
constexpr auto describeArrayParameterWithDefault(dw::core::StringView &&typeName, dw::core::StringView &¶meterName, std::array< T, ArraySize > defaultValue, const MemberPointers &&... memberPointers)
ConstructorArgumentT ConstructorArgumentType
constexpr ConstructorArgumentDescriptorT(ParameterDescriptorsType &¶meterDescriptors_)
ParameterDescriptorsT ParameterDescriptorsType
ParameterDescriptorsType parameterDescriptors
static constexpr size_t ARRAY_SIZE
static constexpr bool IS_INDEX
dw::core::StringView typeName
std::tuple< const MemberPointers... > memberPointers
static constexpr bool HAS_DEFAULT
static constexpr bool IS_ABSTRACT
constexpr ParameterDescriptorT(dw::core::StringView &&typeName_, dw::core::StringView &¶meterName_, const MemberPointers &&... memberPointers_)
dw::core::StringView parameterName
SemanticType_ SemanticType
constexpr ParameterDescriptorWithDefaultT(dw::core::StringView &&typeName_, dw::core::StringView &¶meterName_, DefaultType &&defaultValue_, const MemberPointers &&... memberPointers_)