概念はコンパイル時の述語として定義されているため、これらの述語をコンパイル時のアルゴリズムに実際に再利用することもできますか?たとえば、タプルのすべての型がコンセプトに準拠しているかどうかを確認することは可能でしょうか?私が見た限りでは、概念を関数に渡すことは決して不可能であり、そのため、これらの場合にテンプレートを使用することに戻ってきました。
#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>());
}
私がやりたいのは次のようなものなので、それを使用できるようにするために常にコンセプトをラップする必要はありません。
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>());
}
これに近づく方法はありますか?
@Evg素晴らしい:)
—
Igor R.
all_types()
折りたたみ式を使用して大幅に簡略化できます... &&
:return (... && Predicate::template test<Ts>());