[GiNaC-list] Bug with evalm()?

Richard B. Kreckel kreckel at ginac.de
Mon Mar 26 21:50:11 CEST 2007


Hi!

Sheplyakov Alexei wrote:
>>Because it is certainly non standard, that you construct an instance
>>of some class Add(x,x) and it returns an instance of a completely
>>different class Mul(2,x).
> 
> 
> This is certainly impossible in C++. But the question is: may be
> "virtual constructors" are not necessary at all? Suppose there is 
> the Polynomial<Ring> type, and 
> 
> Polynomial<Ring3> operator+(const Polynomial<Ring2>&, const
> Polynomial<Ring1>&);
> Polynomial<Ring3> operator*(const Polynomial<Ring2>&, const
> Polynomial<Ring1>&);
> Polynomial<Ring3> operator*(const Polynomial<Ring2>&, const Ring1&);
> etc.

I suppose you meant Ring1 == Ring2 == Ring3.

> Thus the return types are known at the compile time: if x is polynomial,
> then x + x is polynomial too. Thus there is no need for "virtual 
> constructors". And compiler can catch more mistakes:
> 
> Polynomial<Z> A = x; // OK
> Polynomial<Z> B = x + 0.5; //  ERROR

Right, but all this is not too helpful when there is no way of knowing 
at compile time what the ring is. After all, modular rings are different 
types if they have different moduli and knowing the modulus at compile 
time is not always possible. Think of public-key crypto algorithms where 
moduli have typically around 1000 bits and are determined dynamically by 
RNGs followed by a probabilistic primality test.

Did you know that CLN's cl_univpoly_ring class is doing more or less 
what you suggest? It is delegating consistency checks like the above to 
runtime, however. And it is somwehat too complicated, in my opinion.

Alas, there is no way out of this: Parametric types in C++ are 
determined at compile time. Just like all types in C++.

Best
   -richy.
-- 
Richard B. Kreckel
<http://www.ginac.de/~kreckel/>


More information about the GiNaC-list mailing list