0

私は、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

4

1 に答える 1

4

引数が同じであるSpecialCaseの特殊なケースを追加できます。

template < typename T >
struct is_same < SpecialCase < T >, SpecialCase < T > >
{ enum { value = 1 }; };

これは、あいまいな候補のそれぞれよりも具体的です。

編集:ここに完全なコードがあります:

#include <iostream>
template<typename T, typename U> struct is_same {
    enum { value = 0 };
};
template<typename T> struct is_same<T, T> {
    enum { value = 1 };
};

template<typename T> struct SpecialCase {  };

template < typename T >
struct is_same < SpecialCase < T >, SpecialCase < T > >
{
  enum { value = 1 };
};

template<typename LT, typename RT> struct is_same<SpecialCase<LT>, SpecialCase<RT> > {
    enum { value = 1 };
};

int main ( int, char** )
{
std::cout 
<< is_same < SpecialCase < int >, SpecialCase < int > >::value
<< is_same < SpecialCase < int >, SpecialCase < double > >::value
<< is_same < SpecialCase < int >,  double >::value
<< is_same < double, SpecialCase < int > >::value
<< is_same < double, double >::value
<< is_same < double, int >::value
<< std::endl;
return 0;
}
于 2012-12-13T16:58:09.210 に答える