私は次のようなテンプレート基本クラスを持っています:テンプレート関数を基本型と派生型に限定しますか?
template<typename T, std::size_t Size>
class VectorT
{
public:
typedef T data_type;
}
といくつかの特殊な派生クラス:
template<typename T>
class Vector2d : public VectorT<T, 2U>
{ // some specialised functions }
template<typename T>
class Vector3d : public VectorT<T, 3U>
{ // some other specialised functions }
これらは正常です。 Howerver、私は演算子のためのいくつかの自立した関数を持っています。例:
template<typename T, size_t Size>
VectorT<T, Size> operator*(T lhs, const VectorT<T, Size>& rhs)
{
...
}
残念ながら、これらはVector2d<T>
の代わりにVectorT<T, Size>
を返すので、これらは派生クラスでは機能しません。
template<V>
V operator*(typename V::data_type lhs, const V& rhs)
{
...
}
これはうまくいきますが、data_typeメンバーで何かを吸うので、あいまいさにつながります。
これを回避するにはどうすればよいですか?ベクターベースまたはその派生物でしか機能しないタイプセーフな関数を書くにはどうすればよいですか?
私は再宣言し、サブクラスの演算子を再度定義する必要が回避しようとしています。
ありがとうございます、これは今晩私がSFINAEに関連する回答を与えた2回目です。私はこれが私の知識のギャップがどこにあるのかと思います!私はenable_ifがどのように動作するのか正確にはわかりませんが、これは本当にうまくいっています。ありがとうございました。 – DanDan
@Kballo: 'boost ::'を 'std ::'で置き換えることに関して - 'std :: enable_if'は' boost :: enable_if_c'と厳密に同じであることに注意してください。したがって ' 'std ::'に切り替えるときには 'is_base_of'の' value 'メンバを自分で作成してください。 –