
AMDG "Michael Fawcett" wrote:
I just implemented it locally. There are probably better ways. In particular I dislike the static variable, but I'm not sure how one could do away with it. Ideas are welcome!
template <typename X, typename Y, typename Z, typename W> struct vec4;
namespace detail {
template <typename X, typename Y = X, typename Z = Y, typename W = Z> struct address_of_dispatch { X *operator()(vec4<X, Y, Z, W> &rhs) const { return rhs.array(); } const X *operator()(const vec4<X, Y, Z, W> &rhs) const { return rhs.array(); } }; template <typename X, typename Y, typename Z, typename W> struct address_of_dispatch<X &, Y &, Z &, W &> { X *operator()(vec4<X &, Y &, Z &, W &> &rhs) const { static vec4<X, Y, Z, W> nrv; nrv = rhs; return nrv.array(); } const X *operator()(const vec4<X &, Y &, Z &, W &> &rhs) const { return (*this)(const_cast<vec4<X &, Y &, Z &, W &> &>(rhs)); } };
}
// Inside vec4's definition typename boost::remove_reference<X>::type *operator&(void) { return detail::address_of_dispatch<X, Y, Z, W>()(*this); } typename boost::remove_reference<X>::type const *operator&(void) const { return detail::address_of_dispatch<X, Y, Z, W>()(*this); }
That works...whether it's the best solution is another story...
Well, even whether it works is debatable. template<class X> void do_stuff(X*, X*); template<class X, class Y, class Z, class W> void f(vec4<X, Y, Z, W>&, vec4<X, Y, Z, W>&) { do_stuff(&arg1, &arg2); }
I'll update the Vault files to include these changes. Thanks for bringing this issue up!
--Michael Fawcett
In Christ, Steven Watanabe