solution to assignment to nested proxies in development?

oswin krause <[email protected]>
Newsgroups gmane.comp.lib.boost.ublas
Message-ID <[email protected]>
Hi everyone,

is there currently a solution implemented in uBLAS for the following 
problem?

blas::matrix<double> mymat(2,20);
noalias(subrange(row(mymat,0),0,10) = ...;

this will fail as row(mymat,0) returns a temporary object which leads to 
subrange being called with something constant, which leads to a constant 
object fed to noalias -> compilation fails, this is not possible.

I think that rvalue references in C++11 might be a solution to this as 
one can just overload subrange with an rvalue version (i hope, i am not 
using C++11 unfortunately). Also there is a slight problem when some 
lunatic calls proxies on a temporary container and assigns something to 
this. In that case some expressions would happily be compiled even 
though it should be a compile error. My current C++03 compatible 
solution uses an additional object.

template<class E>
struct temporary_proxy: public E{
     temporary_proxy(E& e):E(e){}
};

//and for all proxies i have got three versions

//non-const version
template<class E>
temporary_proxy<my_proxy<E> > my_proxy_creator(vector_expression<E> & e){
  return my_proxy<E>(e);
}

//const version
template<class E>
temporary_proxy<my_proxy<E> > my_proxy_creator(vector_expression<E> 
const& e){
  return my_proxy<E const>(e);
}

//temporary proxy version
template<class E>
temporary_proxy<my_proxy<E> > my_proxy_creator(temporary_proxy<E> e){
  return my_proxy_creator(static_cast<E&>(e));
}

using this scheme, the code above happily compiles.

I stumbled into this problem a huge number of times, therefore i came up 
with this solution. Is there maybe a better way?

Regards,
Oswin
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.