2017-05-30 25 views
34

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?

+0

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? –

+1

@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. –

+2

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

cevap

31

doğrudan çelişki Bu CWG active issue 2118 olduğu :

Bir şablondaki bir arkadaş işlevinin tanımlanması, daha sonra bu işleve atıfta bulunmak, meta programlama durumunu yakalama ve alma aracı sağlar. Bu teknik, arcane ve kötü biçimlendirilmiş yapılmalıdır. Mayıs

Notlar 2015 toplantısı:

CWG bunları yasaklayan mekanizması henüz belirlenemeyen olmasına rağmen bu tür teknikler, kötü şekillendirilmiş olması gerektiğine karar verdiler.

Yine de etkin bir sorun, en azından şimdilik C++ 17'de hiçbir şey değişmeyecek. Böyle bir yasaklama mekanizması belirlendiği halde, bu geriye dönük olarak bir DR olarak yönetilebilir.

İlgili konular