C++2a(C++20) Conceptを利用した「ある式が定数式であること」を要求する制約式の定義。
型パラメータT
に対して「T::size()
がコンパイル時に評価されること」を要求するコンセプトHasConstantSize
の定義例。requires式(requires-expression)中の typename type-name;
構文(type-requirement)は、type-name が有効な型であることを表明する。例示コードのように、クラステンプレート特殊化に対しては完全型が要求されない。*1
// C++2a template<auto> struct require_constant; template<class T> concept HasConstantSize = requires { typename require_constant<T::size()>; };
C++2a標準Rangeライブラリ std::range::split_view
定義で同テクニックを利用している。N4810*2 24.7.8.2より一部引用。
namespace std::ranges { template<auto> struct require-constant; // exposition only template<class R> concept tiny-range = // exposition only SizedRange<R> && requires { typename require-constant<remove_reference_t<R>::size()>; } && (remove_reference_t<R>::size() <= 1); // (snip) }
関連URL
*1:N4810 7.5.7.2: "A type-requirement that names a class template specialization does not require that type to be complete."
*2:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/n4810.pdf