On 11/13/06, Nicholas Clark <[EMAIL PROTECTED]> wrote:
On Mon, Nov 13, 2006 at 08:56:14AM +0100, Jeffrey Ratcliffe wrote:
> There are three forms of the C++ new() function, depending on whether
> you are providing a numerator and denominator as initialisation,
> another fraction, or nothing. Can I wrap all three with one function,
> or do I have to create three Perl functions?
Yes, but you'll have to put in explicit logic to decide which C++ new to use
inside your XS code. I'm unaware of any way to automatically wrap overloaded
functions.
OK. I've tried to do this and have got two problems. The first is
casting, I'm getting with the XS fragment listed below:
Fract.xs:45: error: no matching function for call to `fract::fract(fract*&)'
fract.h:17: note: candidates are: fract::fract(long int, long int)
fract.h:16: note: fract::fract(const fract&)
fract.h:15: note: fract::fract()
I've obviously got something not quite right with the
arg = (fract *)SvIV((SV*)SvRV( arg1 ));
line. Any idea what it is?
Secondly, I can't seem to make the arguments optional. Despite the
PROTOTYPE: ;$$
line, the c code produces still starts:
if (items != 3)
Perl_croak(aTHX_ "Usage: Fract::new(CLASS, arg1, arg2)");
{
I'd be grateful for any ideas.
Thanks
Jeff
XS fragment:
fract *
fract::new(arg1, arg2)
SV * arg1
SV * arg2
PROTOTYPE: ;$$
CODE:
if (items == 3) {
RETVAL = new fract(SvIV(arg1), SvIV(arg2));
}
else if (items == 2) {
fract * arg;
arg = (fract *)SvIV((SV*)SvRV( arg1 ));
RETVAL = new fract(arg);
}
else if (items == 1) {
RETVAL = new fract;
}
OUTPUT:
RETVAL