首页 > 后端开发 > C++ > C 中的状态元编程:C 14 中的一种合法技术,但这种情况在 C 17 中会改变吗?

C 中的状态元编程:C 14 中的一种合法技术,但这种情况在 C 17 中会改变吗?

DDD
发布: 2024-11-20 18:52:16
原创
899 人浏览过

Stateful Metaprogramming in C  : A Legal Technique in C  14, But Will That Change in C  17?

有状态元编程:在 C 语言中是否仍然合法

C 中比较有争议的元编程技术之一,有状态元编程,依赖于这个概念constexpr 计数器用于存储和检索元编程状态。目前来看,这种技术在 C 14 下是合法的。但是,这提出了这样的问题:这种情况是否会随着 C 17 的引入而改变。

要理解当前的问题,请考虑以下基于以下实现:上一篇文章:

// State storage flag
template <int N>
struct flag {
    friend constexpr int adl_flag(flag<N>&);
    constexpr operator int() { return N; }
};

// State writer
template <int N>
struct write {
    friend constexpr int adl_flag(flag<N>) { return N; }
    static constexpr int value = N;
};

// State reader
template <int N, int = adl_flag(flag<N>{})>
constexpr int read(int, flag<N>, int R = read(0, flag<N + 1>{})) {
    return R;
}

// Stateful counter
template <int N = 0>
constexpr int counter(int R = write<read(0, flag<0>{}) + N>::value) {
    return R;
}
登录后复制

该技术的使用如下:

// Check if counter is stateful with static assertion
static_assert(counter() != counter(), "Your compiler is mad at you");

// Template specialization based on counter state
template<int = counter()>
struct S {};

// Check if template specializations differ with static assertion
static_assert(!std::is_same_v<S<>, S<>, "This is ridiculous");
登录后复制

但是,状态元编程的合法性在 CWG Active Issue 2118 中受到质疑。该问题建议使用友元由于其晦涩难懂的性质,模板中用于捕获和检索元编程状态的函数应被视为格式错误。

截至 2015 年 5 月,CWG 同意应禁止此类技术,但尚未确定适当的机制。该问题仍然活跃,在做出决定之前,有状态元编程在 C 中仍然是合法的。然而,当禁止机制建立后,该技术可能会被追溯为缺陷报告。

以上是C 中的状态元编程:C 14 中的一种合法技术,但这种情况在 C 17 中会改变吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板