"David B. Held" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > "David Abrahams" <[EMAIL PROTECTED]> wrote in message > news:[EMAIL PROTECTED] > > [...] > > That's a pretty major problem, though. Your idea also cuts off > > implicit conversions. > > Do you mean user-defined conversions, because it consumes one > from by_ref->T? It's more awkward, but wouldn't calling a named > member to get T solve that? > [...]
I wonder if you mean the implicit conversion from T to by_ref in the first place instead. It turns out that I really don't understand how argument deduction goes, because Comeau doesn't like this code, which I expected to work: template <typename T, bool Big = (sizeof(T) > 8)> class by_ref { public: by_ref(T const& val) : val_(&val) { } operator T const&() const { return *val_; } private: T* val_; }; template <typename T> class by_ref<T, false> { public: by_ref(T val) : val_(val) { } operator T() const { return val_; } private: T val_; }; void g(long l) { } template <typename T1> void f(by_ref<T1> v1) { g(v1); } int main() { f(5); } "ComeauTest.c", line 31: error: no instance of function template "f" matches the argument list The argument types that you used are: (int) Also, I was suprised that I had to put parens around the sizeof(T) > 8 expression, as I thought that the parser had to try to match the largest possible token sequence to the template parameter. But maybe that only applies for instantiations, and not definitions? Dave _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost