<div dir="ltr">Noam, that's awesome.  It even works for tuples like so (I didn't think it would):<div><br></div><div>```</div><div><div>enum AaBbEnum {</div><div>    Aa,</div><div>    Bb,</div><div>}</div><div><br>
</div><div>trait AaBb {</div><div>    fn get_type(&self) -> AaBbEnum;</div><div>    fn get_aa(self) -> (int, f64) { fail!(); }</div><div>    fn get_bb(self) -> (f64) { fail!(); }</div><div>}</div><div><br></div>
<div>impl AaBb for (int, f64) {</div><div>    fn get_type(&self) -> AaBbEnum { Aa }</div><div>    fn get_aa(self) -> (int, f64) { self }</div><div>}</div><div><br></div><div>impl AaBb for (f64) {</div><div>    fn get_type(&self) -> AaBbEnum { Bb }</div>
<div>    fn get_bb(self) -> (f64) { self }</div><div>}</div><div><br></div><div>#[cfg(not(test))]</div><div>fn overloaded<T: AaBb>(x: T) {</div><div>    match x.get_type() {</div><div>        Aa => println!("got Aa: {}", x.get_aa()),</div>
<div>        Bb => println!("got Bb: {}", x.get_bb()),</div><div>    }</div><div>}</div><div><br></div><div>fn overloaded_format<T: AaBb>(x: T) -> String {</div><div>    match x.get_type() {</div><div>
        Aa => format!("got Aa: {}", x.get_aa()),</div><div>        Bb => format!("got Bb: {}", x.get_bb()),</div><div>    }</div><div>}</div><div><br></div><div>#[cfg(not(test))]</div><div>#[main]</div>
<div>fn main() {</div><div>    overloaded((5i, 7.3243)); // prints: got Aa: (5, 7.3243)</div><div>    overloaded((3.5)); // prints: got Bb: 3.5</div><div>}</div><div><br></div><div>#[test]</div><div>fn overloaded_with_same_return_works() {</div>
<div>    // now with a shared return<br></div><div>    let x: String = overloaded_format((5i, 7.3243));</div><div>    let y: String = overloaded_format((3.5));</div><div>    assert_eq!(x, "got Aa: (5, 7.3243)".to_string());</div>
<div>    assert_eq!(y, "got Bb: 3.5".to_string());</div><div>}</div></div><div>```<br><div><br></div><div>I imagine if the functions being overloaded have different return types, this gets uglier to use, but this is pretty good!</div>
<div><br></div><div><br></div><div>Kevin</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 11, 2014 at 4:35 AM, Noam Yorav-Raphael <span dir="ltr"><<a href="mailto:noamraph@gmail.com" target="_blank">noamraph@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">You can achieve overloading which is equivalent to C++ by defining a trait for all the types a specific argument can get:<div>
<br></div><div>```</div><div><div>enum IntOrFloatEnum {</div><div>    Int,</div><div>

    F64,</div><div>}</div><div><br></div><div>trait IntOrFloat {</div><div>    fn get_type(&self) -> IntOrFloatEnum;</div><div>    fn get_int(self) -> int { fail!(); }</div><div>    fn get_f64(self) -> f64 { fail!(); }</div>


<div>}</div><div><br></div><div>impl IntOrFloat for int {</div><div>    fn get_type(&self) -> IntOrFloatEnum { Int }</div><div>    fn get_int(self) -> int { self }</div><div>}</div><div><br></div><div>impl IntOrFloat for f64 {</div>


<div>    fn get_type(&self) -> IntOrFloatEnum { F64 }</div><div>    fn get_f64(self) -> f64 { self }</div><div>}</div><div><br></div><div>fn overloaded<T: IntOrFloat>(x: T) {</div><div>    match x.get_type() {</div>


<div>        Int => println!("got int: {}", x.get_int()),</div><div>        F64 => println!("got f64: {}", x.get_f64()),</div><div>    }</div><div>}</div><div><br></div><div>fn main() {</div><div>


    overloaded(5i); // prints: got int: 5</div><div>    overloaded(3.5); // prints: got f64: 3.5</div><div>}</div></div><div>```</div><div><br></div><div>This is equivalent to having to functions, overloaded(int) and overloaded(f64). From what I see, the compiler even optimizes away the logic, so the generated code is actually equivalent to this:</div>


<div><br></div><div>```</div><div>fn overloaded_int(x: int) { println!("got int: {}", x); }</div><div>fn overloaded_f64(x: f64) { println!("got f64: {}", x); }</div><div>fn main() {</div><div>    overloaded_int(5i);</div>


<div>    overloaded_f64(3.5);</div><div>}</div><div>```</div><div><br></div><div>(I actually think that if Rust gains one day some support for overloading, it should be syntactic sugar for the above, which will allow you to define a function whose argument can be of multiple types. I don't like the C++ style of defining several different functions with the same name and letting the compiler choose which function should actually be called).</div>


<div><br></div><div>Using this method you can solve both the problem of overloading and default arguments. For every possible number of arguments that C++ would allow, define a function funcN<T0, T1, TN-1>(arg0: T0, arg1: T1, ..., argN-1: TN-1). The function would check the actual types of the arguments and call the right C++ function, filling default arguments on the way. So the only difference between C++ and Rust code would be that you'd have to add the number of arguments to the method name.</div>


<div><br></div><div>It would probably not be easy to generate the required code, but I think it would solve the problem perfectly.</div><div><br></div><div>Cheers,</div><div>Noam</div></div><div class="gmail_extra"><br><br>


<div class="gmail_quote"><div><div class="h5">On Thu, May 22, 2014 at 11:27 PM, Alexander Tsvyashchenko <span dir="ltr"><<a href="mailto:ndl@endl.ch" target="_blank">ndl@endl.ch</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div class="h5">

<u></u>
<div style="font-family:Verdana,Geneva,sans-serif">
<p>Hi All,</p>
<p>Recently I was playing with bindings generator from C++ to Rust. I managed to make things work for Qt5 wrapping, but stumbled into multiple issues along the way.</p>
<p>I tried to summarize my "pain points" in the following blog post: <a href="http://endl.ch/content/cxx2rust-pains-wrapping-c-rust-example-qt5" target="_blank">http://endl.ch/content/cxx2rust-pains-wrapping-c-rust-example-qt5</a></p>



<p>I hope that others might benefit from my experience and that some of these "pain points" can be fixed in Rust.</p>
<p>I'll try to do my best in answering questions / acting on feedback, if any, but I have very limited amount of free time right now so sorry in advance if answers take some time.</p>
<p>Thanks!</p><span><font color="#888888">
<div>
<pre>-- <br>Good luck!                                     Alexander</pre>
</div>
</font></span></div>
<br></div></div><div class="">_______________________________________________<br>
Rust-dev mailing list<br>
<a href="mailto:Rust-dev@mozilla.org" target="_blank">Rust-dev@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/rust-dev" target="_blank">https://mail.mozilla.org/listinfo/rust-dev</a><br>
<br></div></blockquote></div><br></div>
<br>_______________________________________________<br>
Rust-dev mailing list<br>
<a href="mailto:Rust-dev@mozilla.org">Rust-dev@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/rust-dev" target="_blank">https://mail.mozilla.org/listinfo/rust-dev</a><br>
<br></blockquote></div><br></div></div>