C++ 铸造操作工用SFINAE
我有一个类,它包装一个枚举并为它提供字符串转换。现在,我引入了模板参数“fastStringConvert”,它控制如何使用SFINAE进行转换(可在此处找到:)。代码在MSVC下编译,但在GCC和Clang下失败C++ 铸造操作工用SFINAE,c++,gcc,sfinae,enable-if,typecast-operator,C++,Gcc,Sfinae,Enable If,Typecast Operator,我有一个类,它包装一个枚举并为它提供字符串转换。现在,我引入了模板参数“fastStringConvert”,它控制如何使用SFINAE进行转换(可在此处找到:)。代码在MSVC下编译,但在GCC和Clang下失败 error: no type named ‘type’ in ‘struct std::enable_if<false, void>’ 错误:“struct std::enable_if”中没有名为“type”的类型 有什么问题?我应该如何更改代码 以下或此处代码的相
error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
错误:“struct std::enable_if”中没有名为“type”的类型
有什么问题?我应该如何更改代码
以下或此处代码的相关部分:
#包括
#包括
#包括
模板<
类子类,
typename枚举类型,
bool fastStringConvert=true
>
类智能数
{
公众:
模板<
typename sfinaepostoner=EnumType,
typename=typename std::enable_if::type
>
显式运算符常量std::string&()常量
{
自动名称=子类::名称().find((int)值);
if(name!=子类::names().end())
{
返回名称->秒;
}
其他的
{
静态常量标准::字符串na(“不适用”);
返回na;
}
}
模板<
typename sfinaepostoner=EnumType,
typename=typename std::enable_if::type
>
显式运算符const std::string()const
{
自动名称=子类::名称().find((int)值);
if(name!=SubClass::names().end())返回name->second;
否则返回std::to_字符串((int)值);
}
受保护的:
typedef const std::映射名称;
枚举类型值;
};
枚举类Foo_类型:int{a,b,c};
struct Foo:SmartEnum
{
typedef-num基;
静态常量Base::Names&Names()
{
静态常量Base::Names Names={{0,“a”},{1,“b”},{2,“c”};
返回姓名;
}
};
必须使用方法中的模板参数,否则会出现硬错误,例如:
template <
typename SFINAEPostponer = EnumType,
bool Cond = !fastStringConvert,
typename = typename std::enable_if<Cond, void>::type
>
explicit operator const std::string() const
谢谢,这很有帮助。我甚至不需要这样的第一个参数。你能解释一下这两种解决方案的区别吗?@simon你不能只根据模板参数的默认值来重载函数,就像不能基于其参数的默认值重载函数一样,我最近观看了Stephan t.Lavavej的视频,他建议使用
typename std::enable_if::type=nullptr
,因为没有任何东西可以隐式转换为void**
。
template <
typename SFINAEPostponer = EnumType,
bool Cond = !fastStringConvert,
typename = typename std::enable_if<Cond, void>::type
>
explicit operator const std::string() const
template <
typename SFINAEPostponer = EnumType,
bool Cond = !fastStringConvert,
typename std::enable_if<Cond, void>::type* = nullptr
>
explicit operator const std::string() const