私は、2 つのテンプレート パラメーターが同じ型であるかどうかによって列挙値が設定された、非常に単純なテンプレート構造体を扱っています。
template<typename T, typename U> struct is_same { enum { value = 0 }; };
template<typename T> struct is_same<T, T> { enum { value = 1 }; };
これはライブラリ (Eigen) の一部であるため、このデザインを壊さずに変更することはできません。の場合value == 0
、静的アサートはコンパイルを中止します。
SpecialCase
だから私は、それ自体のさまざまな専門化で操作を実行できる特別な数値テンプレート クラスを持っています。そこで、次のようなオーバーライドを設定しました。
template<typename T> struct SpecialCase { ... };
template<typename LT, typename RT> struct is_same<SpecialCase<LT>, SpecialCase<RT>> { enum { value = 1 }; };
ただし、これによりエラーがスローされます。
more than one partial specialization matches the template argument list
今、私はその理由を理解しています。LT == RT
のつま先を踏むの場合ですis_same<T, T>
。私が知らないのは、SpecialCase
オーバーライドを保持してエラーを取り除く方法です。これを回避するためのトリックはありますか?
編集:明確にするためにLT != RT
、同じと見なされるすべてのケースが必要です(値が1です)。だけではありませんLT == RT
。