SFINAE for cast 运算符
SFINAE for cast operator
我有一个 class,它包装了一个枚举并为其提供了字符串转换。现在我引入了模板参数 'fastStringConvert',它控制如何使用 SFINAE(在此处找到:how can I use std::enable_if in a conversion operator?)进行转换。代码在 MSVC 下编译,但在 GCC 和 Clang 下失败。
error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
可能是什么问题,我应该如何更改代码?
下面或此处代码的相关部分:http://rextester.com/SYC74124
#include <map>
#include <string>
#include <type_traits>
template <
class SubClass,
typename EnumType,
bool fastStringConvert = true
>
class SmartEnum
{
public:
template <
typename SFINAEPostponer = EnumType,
typename = typename std::enable_if<fastStringConvert, void>::type
>
explicit operator const std::string&() const
{
auto name = SubClass::names().find((int)value);
if (name != SubClass::names().end())
{
return name->second;
}
else
{
static const std::string na("n.a.");
return na;
}
}
template <
typename SFINAEPostponer = EnumType,
typename = typename std::enable_if<!fastStringConvert, void>::type
>
explicit operator const std::string() const
{
auto name = SubClass::names().find((int)value);
if (name != SubClass::names().end()) return name->second;
else return std::to_string((int)value);
}
protected:
typedef const std::map<int, std::string> Names;
EnumType value;
};
enum class Foo_type : int { a, b, c };
struct Foo : SmartEnum<Foo, Foo_type, true>
{
typedef SmartEnum<Foo, Foo_type, true> Base;
static const Base::Names &names()
{
static const Base::Names names = { { 0, "a" }, { 1, "b" }, { 2,"c" }};
return names;
}
};
您必须使用方法中的模板参数,否则会出现硬错误,例如:
template <
typename SFINAEPostponer = EnumType,
bool Cond = !fastStringConvert,
typename = typename std::enable_if<Cond, void>::type
>
explicit operator const std::string() const
顺便说一句,最好使用 enable_if
作为类型而不是默认值(以允许禁用部分):
template <
typename SFINAEPostponer = EnumType,
bool Cond = !fastStringConvert,
typename std::enable_if<Cond, void>::type* = nullptr
>
explicit operator const std::string() const
我有一个 class,它包装了一个枚举并为其提供了字符串转换。现在我引入了模板参数 'fastStringConvert',它控制如何使用 SFINAE(在此处找到:how can I use std::enable_if in a conversion operator?)进行转换。代码在 MSVC 下编译,但在 GCC 和 Clang 下失败。
error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
可能是什么问题,我应该如何更改代码?
下面或此处代码的相关部分:http://rextester.com/SYC74124
#include <map>
#include <string>
#include <type_traits>
template <
class SubClass,
typename EnumType,
bool fastStringConvert = true
>
class SmartEnum
{
public:
template <
typename SFINAEPostponer = EnumType,
typename = typename std::enable_if<fastStringConvert, void>::type
>
explicit operator const std::string&() const
{
auto name = SubClass::names().find((int)value);
if (name != SubClass::names().end())
{
return name->second;
}
else
{
static const std::string na("n.a.");
return na;
}
}
template <
typename SFINAEPostponer = EnumType,
typename = typename std::enable_if<!fastStringConvert, void>::type
>
explicit operator const std::string() const
{
auto name = SubClass::names().find((int)value);
if (name != SubClass::names().end()) return name->second;
else return std::to_string((int)value);
}
protected:
typedef const std::map<int, std::string> Names;
EnumType value;
};
enum class Foo_type : int { a, b, c };
struct Foo : SmartEnum<Foo, Foo_type, true>
{
typedef SmartEnum<Foo, Foo_type, true> Base;
static const Base::Names &names()
{
static const Base::Names names = { { 0, "a" }, { 1, "b" }, { 2,"c" }};
return names;
}
};
您必须使用方法中的模板参数,否则会出现硬错误,例如:
template <
typename SFINAEPostponer = EnumType,
bool Cond = !fastStringConvert,
typename = typename std::enable_if<Cond, void>::type
>
explicit operator const std::string() const
顺便说一句,最好使用 enable_if
作为类型而不是默认值(以允许禁用部分):
template <
typename SFINAEPostponer = EnumType,
bool Cond = !fastStringConvert,
typename std::enable_if<Cond, void>::type* = nullptr
>
explicit operator const std::string() const