Consider this
class Base { };
class Derived : public Base { };
Base *f1(Derived *) { return {}; }
Derived *f2(Derived *) { return {}; } // covariant
Base *f3(Base *) { return {}; } // contravariant
Derived *f4(Base *) { return {}; } // covariant & contravariant
using Callback = Base *(*)(Derived *);
Callback pfunc1 = f1; // works of course
// These won't work...
Callback pfunc2 = f2;
Callback pfunc3 = f3;
Callback pfunc4 = f4;
// So I have to make a wrapper for each
Base *f2_wrap(Derived *d)
{
return f2(d);
}
Base *f3_wrap(Derived *d)
{
return f3(d);
}
Base *f4_wrap(Derived *d)
{
return f4(d);
}
// Now it works
Callback pfunc2 = f2_wrap;
Callback pfunc3 = f3_wrap;
Callback pfunc4 = f4_wrap;
So why can't I set a function pointer to a function that has a Derived
object as return value, or a function that has a Base
object as an argument (which works in c# delegate)?
I know I can get around using a wrapper function, but why isn't it part of a language feature?