As far as I know, the template parameter list gets mangled into the symbol name, so adding an additional template parameter will break abi.
On Tue 5. Nov 2019 at 16:44, Petr Kubánek <[email protected]> wrote: > Hi, > > I know what's the problem. I am just looking either to document it or > for a solution. > > Why would: > > template <typename dt> dt sum() > > break API/ABI? You will be able to call either sum() or sum<int32_t>(), > shouldn't you? I will try that and submit a patch. > > Having sum<dt>() working, one can hopefully create mean<dt_sum, > dt_mean>(), so one can code: > > mean<int32_t,double>() > > Petr > > On Tue, 2019-11-05 at 16:36 +0100, Christoph Hertzberg wrote: > > On 05/11/2019 16.11, Peter wrote: > > > [...] > > > > > > actually, this would also be interesting for the scalar products > > > in > > > general, namely a different > > > type for accumulating the sums within a scalar product, e.g. as > > > yet > > > another template parameter for the matrices. > > > > Adding another template parameter to basic types is not an option. > > This > > would break ABI and API compatibility (even if the parameter has a > > default). > > > > You could create your own custom type `my_int16` for which `my_int16 > > * > > my_int16` results in a `my_int32` (this needs to be told to Eigen, > > similar to how real*complex products are handled). > > > > > > [...] > > > > > > I think it's more subtle than that. > > > Even > > > > > > int16_t Two = 2; > > > int16_t Max = INT16_MAX; > > > int16_t mean = ( Max/2 + Max + Two + Two ) / int16_t(4); > > > > > > doesn't produce an overflow. > > > > Yes, because `Max/2` gets implicitly converted to `int`. Actually, > > even > > adding two `int16_t` get implicitly converted to `int` (search for > > integer promotion rules -- I don't know them entirely either). And > > dividing an `int` by an `int16_t` results in an `int` which is only > > afterwards converted to `int16_t`. > > > > In contrast, Eigen::DenseBase::sum() does something (more or less) > > equivalent to: > > > > T sum = T(0); > > for(Index i=0; i< size(); ++i) > > sum+=coeff(i); > > return sum; > > > > i.e., after each addition the result gets reduced to the scalar type > > of > > the matrix, thus it will immediately overflow. > > > > And mean() essentially just takes the return value of `sum()` and > > divides it by the size. > > > > > > Christoph > > > > > > > >
