考虑下面的需求:
一个函数max签名为 return_type max( Argtypes&&...params ) -> max{ params... }
接受任意多参数,参数两两之间满足约束 { v1 < v2 }->bool 的weak_ordering拟序关系
( 具有相同的向下兼容的公共类型,explicit convertion :common_type;或者具有builtin 或 override operator < )
函数调用如下:
int main( void ){
std::puts(R"(max{ 1(int), 2.9( double ),10L( long signed ), 'a'(char),29U(signed) } ==)" );
std::cout << max( 1, 2.9, 10L, 'a', 29U );
endl( std::cout );
return 0;
}
#include <concepts>
#include <algorithm>
#include <iostream>
#include <functional>
template < typename Ty > concept arthmetic
= ( std::integral< Ty >
|| std::floating_point< Ty > );
template < typename Ty, typename Tx > concept comparable
= ( requires( Tx v1, Ty v2) {
{ v1 < v2 }->std::convertible_to< bool >;
} );
template < arthmetic Ty, arthmetic Tx >
requires comparable< Ty, Tx >
inline constexpr auto
max( Ty&& v1, Tx&& v2 ){
return v1 < v2 ? v2 : v1;
}
template < arthmetic Ty, arthmetic ...Args >
requires (comparable< Ty, Args > && ...)
constexpr auto
max( Ty&& first, Args&&...rest ){
if constexpr ( sizeof...( Args ) == 1 ) return max( first, rest...);
return max( std::forward< Ty >( first ),
max( std::forward< Args >( rest )... ) );
}