gpt4 book ai didi

c++ - SFINAE:启用类构造函数

转载 作者:太空狗 更新时间:2023-10-29 21:15:00 24 4
gpt4 key购买 nike

我有一个“参数”类,它可以选择将“标识组类型”作为模板参数 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 )
{ /* ... */ }
};

在实例化参数类时,使用了如下所列的类类型(有趣的部分是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“内部”的方法):

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 ) 应该从构建中省略,对吗?那么为什么会有这样的提示呢?我做错了什么?

非常感谢任何愿意提供帮助的人...

干杯马丁

最佳答案

我想你可以简单地用下面的方式写你的构造函数

template <typename IG = IDENTIFICATION_GROUP>
Parameter (typename std::enable_if<false == std::is_same<IG, ConstrainedParameterIdentification_None>::value, typename IG::IDType>::type const ID)
{ /* ... */ }

如果你可以使用 C++14,std::enable_it_t 应该避免烦人的 typename 和烦人的 ::type,所以

template <typename IG = IDENTIFICATION_GROUP>
Parameter (std::enable_if_t<false == std::is_same<IG, ConstrainedParameterIdentification_None>::value, typename IG::IDType> const ID)
{ /* ... */ }

关于c++ - SFINAE:启用类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39161433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com