Function templates do implicit conversions for their arguments
TommiT
tommitissari at hotmail.com
Tue Jul 2 12:25:48 PDT 2013
On Tuesday, 2 July 2013 at 18:47:00 UTC, Jesse Phillips wrote:
>
> [..] The behavior that it [alias this] should be simulating is
> inheritance, [..]
Okay. I had thought of "alias this" as *merely* implicit
conversion. But it really makes sense that it simulates (models)
inheritance and the implicit conversion (to the "base" type) is
just a consequence of that.
On Tuesday, 2 July 2013 at 18:47:00 UTC, Jesse Phillips wrote:
>
> [..] I'd probably fail writing C++ for this so here is some D
> code to translate:
>
> import std.stdio;
>
> class Wrap(Gift) {
> abstract Gift gift();
> }
>
> class Teddy : Wrap!Teddy {
> int id;
>
> this(int i) { id = i; }
>
> override Teddy gift() { return this; }
> }
>
> Gift tearOpen(Gift)(Wrap!Gift wrappedGift)
> {
> return wrappedGift.gift;
> }
>
> void main() {
> auto ted = new Teddy(123);
> auto r = tearOpen(ted); // NOOOO! Teddy!
> assert(r == ted); // Phew, Teddy was implicitly gift-wrapped
> // and we tore the wrap open, not Teddy.
> }
Here's what the corresponding code would be in C++:
#include <cassert>
template <typename Gift>
class Wrap
{
public:
virtual Gift gift() = 0;
};
class Teddy : public Wrap<Teddy>
{
public:
int id;
Teddy(int i) : id(i) { }
Teddy gift() { return *this; }
bool operator==(const Teddy& other) const
{
return id == other.id;
}
};
template <typename Gift>
Gift tearOpen(Wrap<Gift>& wrappedGift)
{
return wrappedGift.gift();
}
int main()
{
auto ted = Teddy(123);
auto r = tearOpen(ted); // OK
assert(r == ted); // OK
return 0;
}
More information about the Digitalmars-d
mailing list