【发布时间】:2016-08-26 08:10:13
【问题描述】:
我有一个“参数”类,它可以选择将“标识组类型”作为模板参数typename IDENTIFICATION_GROUP:
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 )
{ /* ... */ }
};
在实例化 Parameter 类时,使用了如下所列的类(有趣的部分是 using IDType = int;):
struct SampleIdentificationGroup
{
using IDType = int;
/* ... */
};
除非我像这样实例化参数:
Parameter<si::length, double, SampleIdentificationGroup> Param;
一切正常。
但是一旦我想使用默认值IDENTIFICATION_GROUP - ConstrainedParameterIdentification_None,我的麻烦就来了。我的第一次尝试是在ConstrainedParameterIdentification_None 中也简单地定义IDType,但由于副作用,它不是一个解决方案。因此,我想使用IDENTIFICATION_GROUP "internals (typedefs...)" 启用/禁用参数成员方法。
所以我尝试应用 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 ) 应该从构建中省略,对吧?那么为什么会有这样的抱怨呢?我做错了什么?
非常感谢任何愿意提供帮助的人...
马丁干杯
【问题讨论】:
标签: c++ c++11 constructor sfinae enable-if