- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我试图在我的程序中使作用域枚举与底层类型相当,但以下代码不起作用。是因为我使用的编译器 (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/
假设已经定义了一个 Point2D 类来存储具有 x 和 y 坐标(均为 double )的二维点。该类包括以下成员: 您的任务是通过添加适当的compareTo 方法将该类修改为Comparable
首先,设计:我需要某种树,其中每个节点可以有任意数量的子节点。每个节点携带一个有效负载。节点的总负载是特定节点的负载+其所有祖先直到根节点的负载。 预期在树上执行的操作有:插入、更新、删除(相当频繁)
如果您愿意,可以快速提问或发表意见。 我需要为数据库表生成一些 UUID。 自动递增键不会削减它,因为我还需要键在数据库和系统中是唯一的。 UUID 工作正常,但它的输出对于行将导出到的某些系统来说太
我这样写 map_tail 的尾递归版本: let map_tail f l = let rec map acc = function | [] -> List.rev acc |
我正在为我当前的项目编写自己的测试运行程序。一个特性(这可能在测试运行器中很常见)是每个测试用例都在子进程中执行,因此测试运行器可以正确检测并报告崩溃的测试用例。 我还想测试测试运行器本身,因此一个测
内存中的 H2 - 插入 - 错误 42000 尝试过版本 1.4.196、1.4.197、1.4.199。 我还尝试在 H2 服务器(本地)上执行 INSERT:也失败 给出错误的行:(抱歉,出于安
我正在评估从 Joda-Time 的使用中迁移我的项目到java.time package在 Java 8 。在 Joda-Time 中,我大量使用了 Interval类(class)。我在 java
我是 C# 新手 -- 不到 50 行代码。 所以问题是 C# 中的 ArrayList 是 Java 中 ArrayList 的一个很好的替代品。 以下是我注意到的一些差异: C# 中的 Array
我需要在一个包含将近 100 万条条目的表中进行查询,但有趣的部分只有前 500 条。 我想知道在查询行的末尾使用 Take() 方法是否是速度(和内存)优化方面的最佳选择,或者只是执行整个查询然后获
我从另一篇文章中读到,c++11 提供了闭包功能。据我了解,闭包非常类似于具有私有(private)成员和公共(public)方法的对象。如果不是,那么它有何不同? 最佳答案 闭包是一种从外部作用域访
我是一名优秀的程序员,十分优秀!