- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 c++ 和 cython 的新手,对在 Cython 中包装 C++ friend 非成员运算符感到困惑。这是一个我试图包装但失败的小例子。非常感谢
现在,如何在 pyx 文件中声明友元运算符
all files can be found here, makefile for test -
矩形.h
namespace shapes {
class Rectangle {
public:
int x0, y0, x1, y1;
Rectangle(int x0=0, int y0=0, int x1=0, int y1=0);
~Rectangle();
int getLength();
Rectangle operator+(const Rectangle& target);
friend Rectangle operator-(const Rectangle & left, const Rectangle & right);
};
}
矩形.cpp
#include "Rectangle.h"
using namespace shapes;
Rectangle::Rectangle(int X0, int Y0, int X1, int Y1) {
x0 = X0;
y0 = Y0;
x1 = X1;
y1 = Y1;
}
int Rectangle::getLength() {
return (x1 - x0);
}
Rectangle::~Rectangle()
{
}
Rectangle Rectangle::operator+(const Rectangle & target) {
return Rectangle(x0+target.x0, y0+target.y0,x1+target.x1,y1+target.y1);
}
Rectangle operator-(const Rectangle & left,const Rectangle & right) {
return Rectangle(left.x0 - right.x0,
left.y0-right.y0,
left.x1-right.x1,
left.y1-right.y1);
}
pyx文件
from libcpp.vector cimport vector
from cython.operator cimport dereference as deref
# c++ interface to cython
cdef extern from "Rectangle.h" namespace "shapes":
cdef cppclass Rectangle:
Rectangle() except +
Rectangle(int, int, int, int) except +
int x0, y0, x1, y1
int getLength()
Rectangle opadd "operator+"(Rectangle right)
Rectangle opsub "operator-" (Rectangle right)
# Rectangle opsub "operator-"(Rectangle left ,Rectangle right)
# cdef extern from "Rectangle.h" namespace "shapes":
# cdef Rectangle opsub "operator-"(Rectangle left ,Rectangle right)
# creating a cython wrapper class
cdef class PyRectangle:
cdef Rectangle *thisptr # hold a C++ instance which we're wrapping
def __cinit__(self, int x0=0, int y0=0, int x1=0, int y1=0):
self.thisptr = new Rectangle(x0, y0, x1, y1)
def __dealloc__(self):
del self.thisptr
def getLength(self):
return self.thisptr.getLength()
def __add__(PyRectangle left,PyRectangle right):
cdef Rectangle rect = left.thisptr.opadd(right.thisptr[0])
cdef PyRectangle sum = PyRectangle(rect.x0,rect.y0,rect.x1,rect.y1)
return sum
def __sub__(PyRectangle left,PyRectangle right):
cdef Rectangle rect = left.thisptr.opsub(right.thisptr[0])
# cdef Rectangle rect = opsub(left.thisptr[0],right.thisptr[0])
cdef PyRectangle sub = PyRectangle(rect.x0,rect.y0,rect.x1,rect.y1)
return sub
def __repr__(self):
return "PyRectangle[%s,%s,%s,%s]" % (
self.thisptr.x0,
self.thisptr.y0,
self.thisptr.x1,
self.thisptr.y1)
我尝试过一些方法,比如
cdef extern from "Rectangle.h" namespace "shapes":
cdef Rectangle opsub "operator-"(Rectangle left ,Rectangle right)
或者假装它是 cppclass 声明中的成员定义运算符
Rectangle opsub "operator-" (Rectangle right)
如图所示,我两种方式都编译失败
error: no member named 'operator-' in 'shapes::Rectangle'
最佳答案
抱歉,我在 Rectangle.cpp 中发现了一个大错误。 operator-的定义需要加上命名空间前缀
Rectangle shapes::operator-(const Rectangle & left,const Rectangle & right) {
return Rectangle(left.x0 - right.x0,
left.y0-right.y0,
left.x1-right.x1,
left.y1-right.y1);
}
并且rect.pyx可以根据DavidW的提示修改为直接调用operator。
# c++ interface to cython
cdef extern from "Rectangle.h" namespace "shapes":
cdef cppclass Rectangle:
Rectangle() except +
Rectangle(int, int, int, int) except +
int x0, y0, x1, y1
int getLength()
Rectangle operator+(Rectangle right)
Rectangle operator-(Rectangle right)
#### nonmember operator can also work :
# cdef extern from "Rectangle.h" namespace "shapes":
# cdef Rectangle operator-(Rectangle left ,Rectangle right)
# creating a cython wrapper class
cdef class PyRectangle:
cdef Rectangle *thisptr # hold a C++ instance which we're wrapping
def __cinit__(self, int x0=0, int y0=0, int x1=0, int y1=0):
self.thisptr = new Rectangle(x0, y0, x1, y1)
def __dealloc__(self):
del self.thisptr
def getLength(self):
return self.thisptr.getLength()
def __add__(PyRectangle left,PyRectangle right):
cdef Rectangle rect = left.thisptr[0] + right.thisptr[0]
cdef PyRectangle sum = PyRectangle(rect.x0,rect.y0,rect.x1,rect.y1)
return sum
def __sub__(PyRectangle left,PyRectangle right):
cdef Rectangle rect = left.thisptr[0] - right.thisptr[0]
# cdef Rectangle rect = opsub(left.thisptr[0],right.thisptr[0])
cdef PyRectangle sub = PyRectangle(rect.x0,rect.y0,rect.x1,rect.y1)
return sub
关于c++ - 在 Cython 中包装 C++ friend 非成员运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47938326/
我想知道将来对我来说最简单的方法是什么,可以使查询既有效又不那么复杂。 我应该像这样保存双向关系吗 from_id=1, to_id=2from_id=2, to_id=1 或者只创建一个唯一的行 f
假设您有一个拥有十亿用户的社交网络。在每个用户的页面上,您想要显示该用户的 friend 数、 friend 的 friend 等等,最多五度。友谊是相互的。计数不需要立即更新,但它们应该是精确的。
public void notMyFriend(Student student1) { System.out.println("Friends who are not my frien
我有如下3个表格 用户 - id integer primary_key - user_name friend - id autoincrement primary_key - user1 integ
如何从 Friends 表中获取 friend 列表以及我 friend 的 friend 数(不包括我的 friend 数) friend 表"tbl_users_friends 字段 1:id字段
我的 MySQL 表结构是这样的。 USER int id varchar username FRIEND_LIST int user_id int friend_id 对于每个 friend 关系,
假设 a,b,c 和 b,d,e 和 c,f,g 和 a,e,g,h 是 friend 。所以 获取共同好友 b/w a&b: MATCH (me:User {username:'a'}) -[r:F
我正在开发“可能的 friend ”功能。我需要显示所有不是我 friend 的 friend 的 friend ,也不要发送我或没有我的待处理请求 FRIENDSHIPS user_id frien
如果两个用户是 friend ,我在“ friend ”表中有一个条目,如下所示: table: friends ------------------------ uid1
我有一个 friend 表,用于跟踪数据库中的关系 - 我将一个查询与子查询放在一起,该子查询从 friend 的 friend 那里获取个人资料信息 我的 friend 表如下所示 - id 双向出
我想结交 friend 的 friend 的 friend 。我得到了结果,但我不确定我的查询是否正确。我正在使用嵌套选择。 我的问题是: 查询是否正确? 我如何使用 join 执行此查询? 这是我的
假设我有一个包含 friend 属性的用户对象。这个 friends 属性是其他用户对象的数组,因此是你的 friend 。找到你 friend 的 friend 但不是你 friend 的最快算法是
我想结交我的 friend 以及 friend 的 friend ,但仅限于二级 friend 我的表结构是这样的 user_id friend_user_id 1 2 1
为了了解使用 Neo4J 建立 friend 关系的优势,我在 MySQL 数据库上创建了一张用于 Persons 的表(“Persons”,20900 个数据集): id | name --
假设我有一个名为“ friend ”的表,对于每个友谊,我添加两个条目。例如,如果用户 1 和 2 是 friend ,我们将有: uid1 uid2 ---------- 1 2 2 1
在我的图形数据库中,我有 Twig 和树叶。分支可以“包含”叶子,分支可以“包含”分支。 如何使用 Gremlin 找到与给定分支直接或间接相关的所有叶子? 我让这个在 Cypher 中工作: STA
我正在尝试使用 iPhone Facebook SDK 获取我 friend 的 friend 列表。我尝试了一种使用 FQL 和 Graph API 的方法,但在这两种情况下我都遇到了错误: "Ca
我有这个 MySQL 表: 假设我以用户 1 的身份登录,正在浏览用户 2 的个人资料。由于我们是共同的 friend (1 是 2 的 friend ,2 是 1 的 friend ),我需要回应“
我想得到我 friend 的 friend 不是我 friend 的 friend 。我有一张这样的 table :用户 friend (idUser,idUserFriend) 我在想这样的事情:
我有这个 Cypher 查询... match (p:Person{userid:8432})-[r:friends_with]->(p1:Person)-[r2:friends_with]->(p2
我是一名优秀的程序员,十分优秀!