Ich habe eine CRTP Basisklasse wie folgt:Expression Templates arbeiten, nicht für primitive Art Überlastungen unter Klirren
template<typename Derived, size_t DIMS>
class Base {
public:
// here is I think where the problem is
inline const Derived& self() const {return *static_cast<const Derived*>(this);}
};
Dann wird die abgeleitete Klasse ist definiert als
template<typename T, size_t ... Rest>
class Derived: public Base<Derived<T,Rest...>,sizeof...(Rest)> {
public:
Derived() = default;
// This constructor binds any arbitrary expression to Derived
template<typename Expr, size_t DIMS>
inline Derived(const Base<Expr,DIMS>& src_) {
const Expr &src = src_.self();
print(src.rhs);
}
};
mit meinen eigenen Betreiber im Sinn der Definition Ich habe auch die folgenden AddOperator
, die auch von der Basis
template<typename TLhs, typename TRhs, size_t DIMS>
struct AddOperator: public Base<AddOperator<TLhs, TRhs, DIMS>,DIMS> {
AddOperator(const TLhs& lhs, const TRhs& rhs) : lhs(lhs), rhs(rhs) {
print(rhs);
}
const TLhs &lhs;
const TRhs &rhs;
};
erbt
Dann wird die operator+
Überlastung zwischen einem Derived
Typ und einem primitiven Typ gibt nur einen Proxy/Ausdruck der Art:
template<typename TLhs, typename TRhs, size_t DIM0,
typename std::enable_if<!std::is_arithmetic<TLhs>::value &&
std::is_arithmetic<TRhs>::value,bool>::type = 0 >
inline AddOperator<TLhs, TRhs, DIM0>
operator+(const Base<TLhs,DIM0> &lhs, TRhs rhs) {
return AddOperator<TLhs, TRhs, DIM0>(lhs.self(), rhs);
}
Allerdings, wenn ich das ich Müll Werte unter clang
rufen erhalten für rhs
von AddOperator
. Hier ein Beispiel:
int main() {
Derived<double,2,2> g;
Derived<double,2,2> x = g+28;
return 0;
}
Die anderen Überlastungen, wenn beide lhs
und rhs
in AddOperator
vom Typ sind Derived
dieses Problem nicht hat. Dieses Problem tritt nur unter clang
auf. gcc
kompilierter Code scheint gut zu laufen. Weiß jemand, wo das Problem liegt?
Ich habe es selbst bemerkt, sobald ich die Frage gepostet habe. Vielen Dank –