ほとんどすべての数学演算が引数を に変換するのは、C++ の癖ですint
。
非拡大%mod%
演算子のスケッチを次に示します。
template<class T, class U,class=void> struct smallest{using type=T;};
template<class T, class U>
struct smallest<T,U,std::enable_if_t<(sizeof(T)>sizeof(U))>>{using type=U;};
template<class T,class U>using smallest_t=typename smallest<T,U>::type;
constexpr struct mod_t {} mod;
template<class LHS>struct half_mod { LHS lhs; };
template<class LHS>
constexpr half_mod<std::decay_t<LHS>> operator%( LHS&& lhs, mod_t ) { return {std::forward<LHS>(lhs)}; }
template<class LHS, class RHS>
constexpr smallest_t<LHS, std::decay_t<RHS>> operator%( half_mod<LHS>&& lhs, RHS&& rhs ) {
return std::move(lhs.lhs) % std::forward<RHS>(rhs);
}
a mod b の結果は、2 つのタイプのうち最小のものになる必要があります。これより大きくなることはありません。おそらく、署名済み/未署名用にいくつかの作業を行う必要がありますが、パントして最初のものを取得します。
id %mod% 3
で終わるchar
。