Kavramlar derleme zamanı tahminleri olarak tanımlandığından, bu tahminleri derleme zamanı algoritmaları için yeniden kullanmak da mümkün müdür? Örneğin, bir demet içindeki tüm tiplerin bir konsepte uygun olup olmadığını kontrol etmek mümkün müdür? Gördüğüm kadarıyla, bir kavramı bir işleve herhangi bir şekilde aktarmak mümkün değil, bu da beni bu durumlar için şablonlar kullanmaya geri götürüyor.
#include <type_traits>
template<typename T>
concept FloatLike = std::is_same_v<T, float>;
struct IsFloat
{
template<typename U>
constexpr static bool test()
{
return FloatLike<U>;
}
};
template<typename Predicate, typename... T>
constexpr bool all_types()
{
return (Predicate::template test<T>() && ...);
}
int main()
{
static_assert(all_types<IsFloat, float, float>());
static_assert(!all_types<IsFloat, float, int>());
}
Ne yapmak istiyorum böyle bir şey, bu yüzden kullanmak için her zaman kavramı sarmak zorunda değilim:
template<concept Predicate, typename... T>
constexpr bool all_types()
{
return (Predicate<T> && ...);
}
int main()
{
static_assert(all_types<FloatLike, float, float>());
static_assert(!all_types<FloatLike, float, int>());
}
Buna yaklaşmanın bir yolu var mı?
all_types()
kat ifadeleri kullanılarak önemli ölçüde basitleştirilebilir... &&
:return (... && Predicate::template test<Ts>());