Karşılaştığım en sevgili/kötülük icatlarından biri de, durumsal meta programlama olan constexpr counter. Gönderide de belirtildiği gibi, C++ 14 altında yasal görünüyor ve merak ediyorum C++ 17 ile bir şey değişti mi? AşağıdakiDurum bilgisi olan meta program oluşturuyor (henüz)?
ölçüde mesaja
template <int N>
struct flag
{
friend constexpr int adl_flag(flag<N>);
constexpr operator int() { return N; }
};
template <int N>
struct write
{
friend constexpr int adl_flag(flag<N>) { return N; }
static constexpr int value = N;
};
template <int N, int = adl_flag(flag<N>{})>
constexpr int read(int, flag<N>, int R = read(0, flag<N + 1>{}))
{
return R;
}
template <int N>
constexpr int read(float, flag<N>)
{
return N;
}
template <int N = 0>
constexpr int counter(int R = write<read(0, flag<0>{}) + N>::value)
{
return R;
}
dayalı bir uygulamasıdır Ve biz use it arada
static_assert(counter() != counter(), "Your compiler is mad at you");
template<int = counter()>
struct S {};
static_assert(!std::is_same_v<S<>, S<>>, "This is ridiculous");
Bu
olarak, Storing States in C++ Metaprogramming?
Okunan (0, bayrak {}) 'sonsuz döngüde nasıl sonuçlanmaz? İlk harfli 0, doğal olarak tekrar tekrar ve tekrar arayacak olan ilk aşırı yükü ('float' üzerinden tercih ediliyor) çağırır. Sonlandırma koşulu nedir? –
@NicolBolas SFINAE tarafından, '' int' aşırı yüklenme '(0, bayrak {}) 'henüz yeterince tanımlı değiliz, çünkü henüz adl_flag tanımlamadık (bayrak )'; float'ın aşırı yüklenmesi çağrılabilir. Tam açıklama için bağlantılı yazı mükemmel bir şekilde yazılmıştır. –
Ayrıca, David Krauss'un ilgili tartışma konusundaki kusurlarına dikkat edin (https://groups.google.com/a/isocpp.org/d/msg/std-discussion/M6aJMH_ewoM/eAaBooYw-MsJ) Filip, dördüncü bir yazıya hitap etmeyi vaat etti ama asla yapmadı. – Columbo