【发布时间】:2018-08-08 01:38:33
【问题描述】:
我了解强类型枚举器可以转换为其基础类型:
template<typename E> constexpr
auto to_integral(E e) -> typename std::underlying_type<E>::type
{
return static_cast<typename std::underlying_type<E>::type>(e);
}
但是,这是在运行时工作的。
既然枚举器在编译时已经存在,有没有办法在编译时进行这种转换?
【问题讨论】:
-
“但是,这是在运行时工作的。”你为什么这么认为?
-
@cpplearner 这是一个函数调用,函数调用在运行时工作,对吧?
-
该标准根本没有“编译时间”的概念,因此它不能保证任何事情。它有一个“常量表达式”的概念。
-
IMO 如果编译器不优化该调用完全它不会优化任何东西。
-
我在 Godbolt 上玩过你的样本。为此,我添加了第二个
to_integral_rt()没有constexpr(以查看差异)。 gcc 8.1--std=c++17为const int i = to_integral(E::E123);编译一个mov,为非constexpr风格编译一个movcall to_integral_rt()mov。但是,添加-O2两个调用都被优化掉了——两个常量都直接设置到输出命令中。 (我希望像过去那样摆弄类似的事情。)Live Demo on godbolt
标签: c++ c++11 strongly-typed-enum