template<class CRTP> Base
現在、基本クラスと派生クラスDerived1 : public Base<Derived1>
を使用してCRTPを実装していDerived2 : public Base<Derived2>
ます...
算術演算子は で定義されており、 a に a を追加できますが、 aに a を追加できないことを意味するBase
タイプです。CRTP Base<CRTP>::operator+(const CRTP& rhs)
Derived1
Derived1
Derived2
Derived1
さらに、 を返すBase<CRTP>& Base<CRTP>::operator()()
ことを意味する演算子を定義しました。Derived1()
Base<Derived1>&
次のことを行う解決策があるかどうか疑問に思います:
Derived1 = Derived1 + Derived1 : OK
Derived2 = Derived2 + Derived2 : OK
Derived1 = Derived1 + Derived2 : NOT OK
Derived1 = Derived1() + Derived2() : OK
最後の2行によると:
- ユーザーのミスを防ぎます
- しかし、彼が本当にこの操作をしたいのであれば、派生型を基本型に「キャスト」することができ、それは機能します。
これを行う必要があるのは、そのような演算子を定義することだけです:
template<class CRTP0, class = typename std::enable_if</* SOMETHING */>::type>
Base<CRTP> Base<CRTP>::operator+(const Base<CRTP0>& rhs)
enable_if では、次のようなものが欲しいです:
true
: rhs がBase
タイプの場合false
: rhs がDerived
型の場合
そのようなものは存在しますか?他の解決策を考えていますか?
どうもありがとうございました !