>  기사  >  백엔드 개발  >  C의 상태 저장 메타프로그래밍: C 14의 법적 기법, 하지만 C 17에서는 바뀔까요?

C의 상태 저장 메타프로그래밍: C 14의 법적 기법, 하지만 C 17에서는 바뀔까요?

DDD
DDD원래의
2024-11-20 18:52:16806검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.