Perl xs - 无法从方法调用返回新的自定义 C++ 对象 - 改为返回标量值
perl xs - can't return a new custom c++ object from method call - returns scalar value instead
在我的XS文件中,我有:
作为我的新方法:
matrix *
matrix::new( size_t ncols, size_t nrows )
它返回一个CCD_ 1对象,我可以调用方法。
然后我有一个方法调用,它创建了一个新的矩阵对象,并将其作为一个新矩阵返回:
matrix *
matrix::getInnerMatrix( )
PREINIT:
char * CLASS = (char *)SvPV_nolen(ST(0));
CODE:
RETVAL = static_cast<matrix*>(THIS->matrix::getInnerMatrix());
OUTPUT:
RETVAL
然而,返回的类型是matrix=SCALAR(0x122f81c)
,因此我无法从该对象调用任何方法调用,因为perl解释器似乎将返回的类型视为标量值类型,而不是"matrix"对象。这是一个测试脚本:
$m1 = matrix::new(matrix,4,4);
@arr = ( 1 .. 16 );
$aref = [@arr];
$m1->assign_aref($aref);
my $m2 = $m1->getInnerMatrix();
print ref $m1; # returns "matrix" (like it should)
print "nn";
print ref $m2; # returns "matrix=SCALAR(0x122f81c)" (wrong)
这是我的打字图:
TYPEMAP
matrix * O_MATRIX
OUTPUT
O_MATRIX
sv_setref_pv( $arg, CLASS, (void*)$var );
INPUT
O_MATRIX
if ( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) {
$var = ($type)SvIV((SV*)SvRV( $arg ));
}
else {
warn( "${Package}::$func_name() -- ${var} not a blessed SV reference" );
XSRETURN_UNDEF;
}
为了确保返回纯matrix
对象,我必须对XS文件或任何其他文件进行哪些更改?
在C++中使用XS时,XS预处理器会为实例方法插入THIS
,为静态方法插入CLASS
。称为new
的方法被视为静态方法。这允许生成的xsubs在默认情况下用作实例方法/类方法:matrix->new
和$m->getInnerMatrix()
。
您的类型映射使用CLASS
变量,该变量不是为实例方法提供的。在您的情况下,我会在类型映射中硬编码包名称:
OUTPUT
O_MATRIX
sv_setref_pv( $arg, "matrix", (void*)$var );
当该类型的参数未用作调用程序时,也会使用typemap。例如,考虑这个xsub:
matrix*
some_other_xsub(x)
int x
在这里,matrix
1返回值也不会有CLASS
变量。
请注意,小写的包名称应仅用于杂注包(如strict
或warnings
)。请在课堂上使用CamelCase。
您为CLASS
提供自己的值的尝试失败,因为SvPV_nolen()
字符串提供了引用,但没有获得引用类型。即它相当于"$m"
,而不是ref $m
。一个更正确的替代方案是使用sv_ref()
:
char* CLASS = SvPV_nolen(sv_ref(NULL, THIS, true));
sv_ref()
的第三个参数使该函数的工作方式类似于Perl函数ref
,即如果标量是幸运的,则返回类名,而不仅仅是底层引用类型。
相关文章:
- 如何返回对象C++的数组
- 如何使用std::min和std::less返回对象
- 如何通过引用返回对象
- 如何安全地从 DLL 调用返回对象
- 如何在不销毁对象的情况下返回对象列表
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 使用返回对象的函数处理错误
- 何时返回指针与返回对象的一般经验法则?
- 如何使用运算符+重载函数正确返回对象?
- C++,class,一个返回对象的函数
- 运算符的返回对象 = C++ 中的重载
- 从队列返回对象的最快方法,但前提是队列有它
- 如何使用条件表达式返回对象指针?
- 使用构造函数从函数返回对象
- 隐式转换函数的返回对象时是否会影响性能?
- 返回对象时从'const DList<int>* const'到 'DList<int>*' [-fallowive] 的转换无效
- 按值和堆栈大小限制返回对象
- 我应该如何从函数返回对象?
- c++:何时传递指针与返回对象
- 返回对象会丢失属性