Ale*_*der 5 c++ enums templates constexpr c++17
出于说明目的,我展示了两个小的、略有不同的模板化递归定义。一个使用 an enum,另一个使用static constexpr定义一个值。
我检查了两个程序的输出程序集,它们完全相同,并且在语义上它们看起来也相同。
我认为constexpr可能更现代一些,但是使用enum/之间有什么区别static constexpr,或者是否有任何特定用例的区别真的很重要?
// using enum
template<uint64_t N>
struct Sum {
enum : uint64_t { value = N + Sum<N - 1>::value };
};
template<>
struct Sum<0> {
enum : uint64_t { value = 1 };
};
Run Code Online (Sandbox Code Playgroud)
// using static constexpr
template<uint64_t N>
struct Sum {
static constexpr uint64_t value = N + Sum<N - 1>::value;
};
template<>
struct Sum<0> {
static constexpr uint64_t value = 1;
};
Run Code Online (Sandbox Code Playgroud)
提取值:
#define sum(n) (Sum<n>::value)
Run Code Online (Sandbox Code Playgroud)
最显着的区别(因为 C++17 避免了对静态数据成员的类外定义的需要)是枚举数与包含类一起实例化,而静态数据成员仅在需要时实例化。(但是请注意,至少 MSVC 并不总是正确地推迟它们。)
当您有几个这样的常量并且其中一些仅对某些专业有意义时,这很重要。 在静态数据成员情况下实例化类不会触发初始化器中的错误T::maybe_exists。
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |