Standard Concepts Regular and Semiregular Types Ranges Common Range Best Practices C++ type traits vs concepts