After thinking about boost::ref and the auto_ptr by_ref trick, I
wondered if these could be applied to the function forwarding
problem, like so:

template <typename R, typename T1, typename T2, ...>
R f(by_ref<T1> v1, by_ref<T2> v2, ...)
{
    g(v1, v2, ...);
}

template <typename T>
class by_ref
{
    // ... like boost::reference_wrapper
};

template <>
class by_ref<int>
{
    // value-semantics specializations for fundamental types
};

template <>
class by_ref<double>
{
    // value-semantics specializations for fundamental types
};

template <typename T>
class by_ref<T*>
{
    // ...
};

// etc.

So the default would be to pass by reference, and provide
specializations for known types that should be passed by value,
and let the user specify other types that are pass-by-value.
Another alternative would be go by size, maybe like so:

template <typename T, bool Big = sizeof(T) > 8>
class by_ref
{
    // reference semantics
};

template <typename T>
class by_ref<T, false>
{
    // value semantics
};

Is this is a worthwhile idea to pursue?  Am I missing any critical
details?  I realize there is still a problem with const vs. non-const
references, but I won't even try to solve that. ;)

Dave



_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to