constexpr
yapıcısına iletilen bir başlatıcı listesinin belirli bir boyutta olduğunu doğrulamak mümkün olabilir mi? Yoksa bu sadece çalışma zamanında yapmak mümkün olabilir mi? Bir initializer listesinin belirli bir boyutta olması statik_assert
Bu
fikir, ama çalışmıyor: Ben VS2015 enstd::initializer_list
uygulanması ve
begin()
,
end()
ve
size()
baktım
struct group
{
constexpr group(
std::initializer_list<std::initializer_list<UINT const> const> groups
)
{
static_assert(each_list_size_greater_than_1(groups.begin(), groups.end()));
}
constexpr static bool each_list_size_greater_than_1(
std::initializer_list<std::initializer_list<UINT const> const>::const_iterator const begin
, std::initializer_list<std::initializer_list<UINT const> const>::const_iterator const end)
{
return begin == end || begin->size() > 1 && each_list_size_greater_than_1(begin + 1, end);
}
};
tüm constexpr
fonksiyonlardır. Bir std::initializer_list<T>
ait size()
bir constexpr
bir constexpr
işlev içinde bir constexpr
gibi davranmaya olmaz size()
üyesini değerlendirmek rağmen
Son ifadenizle ne kastedildi: 'Şimdiye kadar, farklı bir döndürme türü yalnızca şablon argümanlarını ve/veya sayılarını değiştirerek olabilirsiniz. – Adrian
@Adrian: C++ standartlarına göre en az C++ 1z'ye kadar, işlev argümanlarının _value_'ına dayalı bir işlev için farklı dönüş türleri oluşturamazsınız. Dönüş türünü değiştirmek için işlevin _type_'ini değiştirmeniz gerekecektir. Aslında bir fonksiyonun dönüş türünü değiştirmeyle ilgilendiğinizi değil, bir argüman değerinin 'constexpr' olarak kullanıldığını düşünmüyorum. Bununla birlikte, bir argüman değeri bir fonksiyon içinde bir "constexpr" olarak kullanılabiliyorsa, geri dönüş türünde aynı değer kullanılabilir, böylece şu anda izin verilmeyen bir şey yapılabilir. –