У меня есть класс «параметра», который необязательно имеет место в «групповой идентификации типа» в качестве аргумента шаблона typename IDENTIFICATION_GROUP
:SFINAE: Включить конструктор класса
struct ConstrainedParameterIdentification_None {};
template<typename UNIT_TYPE, typename DATA_TYPE = double, typename IDENTIFICATION_GROUP = ConstrainedParameterIdentification_None>
class Parameter
{
/* Constructor - the only method taking care about valid IDENTIFICATION_GROUP */
template<typename = std::enable_if<!std::is_same<IDENTIFICATION_GROUP, ConstrainedParameterIdentification_None>::value>>
Parameter(const typename IDENTIFICATION_GROUP::IDType ID)
{ /* ... */ }
};
В то время как instantinating класса параметров, типа класса, как перечисленные ниже является б (interresting часть using IDType = int;
):
struct SampleIdentificationGroup
{
using IDType = int;
/* ... */
};
Если я не instantiante параметр так:
Parameter<si::length, double, SampleIdentificationGroup> Param;
все работает нормально.
Но как только я хочу использовать значение по умолчанию IDENTIFICATION_GROUP
- ConstrainedParameterIdentification_None
, наступает моя проблема. Моя первая попытка состояла в том, чтобы просто определить IDType
также в ConstrainedParameterIdentification_None
, но из-за побочных эффектов это не решение. Поэтому я хотел бы включить/отключить методы-члены параметра, используя «внутренности (typedefs ...)» IDENTIFICATION_GROUP
».
Так что я попытался применить SFINAE, чтобы включить/отключить мой конструктор (единственный метод, заботясь о IDENTIFICATION_GROUP
«Internals):
template<typename = std::enable_if<!std::is_same<IDENTIFICATION_GROUP, ConstrainedParameterIdentification_None>::value>>
Parameter(const typename IDENTIFICATION_GROUP::IDType ID)
{ /* ... */ }
В человеческом языке, что я пытаюсь достичь является» ЕслиIDENTIFICATION_GROUP
являетсяConstrainedParameterIdentification_None
, исключить весь метод. .»
Но GCC жалуется на тип IDType не определен:
error: no type named ‘IDType’ in ‘struct Base::ConstrainedParameterIdentification_None’
Parameter(const typename IDENTIFICATION_GROUP::IDType ID)
Но из-за SFINAE, то Parameter(const typename IDENTIFICATION_GROUP::IDType ID)
должны быть исключены из сборки, правда Так почему такое жалуется Что я делаю? неправильно?
Большое спасибо заранее, кто готов помочь ...
Приветствия Martin
Таким образом, передача несуществующего типа в качестве параметра шаблона по-прежнему является действительным случаем для SFINAE. Хорошо знать! – Dmitry