gpt4 book ai didi

c++ - 使作用域枚举与基础类型相当

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:27 27 4
gpt4 key购买 nike

我试图在我的程序中使作用域枚举与底层类型相当,但以下代码不起作用。是因为我使用的编译器 (VC11) 对 C++11 标准的支持很差,还是因为代码违反了 C++11 标准的一些规则?在后一种情况下,究竟违反了哪些规则(欢迎引用特定的标准条款)?

#include <type_traits>
enum class Test: short int { A,B,C };
template<typename E> bool operator != (E e, typename std::underlying_type<E>::type n)
{
return static_cast<typename std::underlying_type<E>::type>(e) != n;
}
template<typename E> bool operator != (typename std::underlying_type<E>::type n, E e)
{
return static_cast<typename std::underlying_type<E>::type>(e) != n;
}
int main()
{
short int x = 123;
x != Test::B; // compilation error
}

这就是我认为我的代码应该符合 C++11 的原因。引自 C++11 标准 (14.8.3.1):

For each function template, if the argument deduction and checking succeeds, the template arguments (deduced and/or explicit) are used to synthesize the declaration of a single function template specialization which is added to the candidate functions set to be used in overload resolution. If, >for a given function template, argument deduction fails, no such function is added to the set of >candidate functions for that template.

编辑。我的代码不符合 C++11(感谢 Vaughn Cato 和 Andy Prowl 的解释)。 Andy Prowl 的回答中提供了替代工作代码。

附言毕竟我最终使用命名空间将无作用域的枚举限定了作用域:

namespace Test_ {
enum Test { A,B,C };
};
using Test_::Test;

namespace Test2_ {
enum Test2 { Z,Y,B };
};
using Test2_::Test2;

最佳答案

当相应的参数不是枚举时,您可以使用 SFINAE 排除比较运算符签名的实例化(以及 std::underlying_type<T> 的实例化):

#include <type_traits>

template<typename E,
typename std::enable_if<std::is_enum<E>::value>::type* = nullptr>
bool operator != (E e, typename std::underlying_type<E>::type n)
{
return static_cast<typename std::underlying_type<E>::type>(e) != n;
}

template<typename E,
typename std::enable_if<std::is_enum<E>::value>::type* = nullptr>
bool operator != (typename std::underlying_type<E>::type n, E e)
{
return static_cast<typename std::underlying_type<E>::type>(e) != n;
}

这是一个live example .

编辑:

由于 VC11 似乎不支持函数模板的模板参数的默认参数,这里有一个替代解决方案:

template<typename E>
typename std::enable_if<std::is_enum<E>::value, bool>::type
operator != (E e, typename std::underlying_type<E>::type n)
{
return static_cast<typename std::underlying_type<E>::type>(e) != n;
}

template<typename E>
typename std::enable_if<std::is_enum<E>::value, bool>::type
operator != (typename std::underlying_type<E>::type n, E e)
{
return static_cast<typename std::underlying_type<E>::type>(e) != n;
}

还有一个 live example当然。

关于c++ - 使作用域枚举与基础类型相当,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15460325/

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