- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题
我有一个从 C++ 函数返回的非常大的 std::vector
,我们称之为 getVector()
。
现在我想将该函数包装在 Cython 中:
cdef extern from "XY.h":
cdef cppclass _XY:
vector[double] getVector() except +
cdef class XY:
cdef _XY _this
...
def getVector():
return self._this.getVector()
cdef extern from "<utility>" namespace "std":
vector[double] move(vector[double]) # Cython has no function templates
def getVector():
return move(self._this.getVector())
最佳答案
编辑: 在@DavidW 发出警告后,我意识到我误解了您的问题。下面的答案只是让您直接使用来自 cython 的模板化 move
,而无需为每种移动类型(例如,您在问题中为 std::vector<double>
声明的类型)进行显式声明。
您可以使用此辅助函数来包装 std::move
调用:
# distutils: language = c++
cdef extern from * namespace "polyfill":
"""
namespace polyfill {
template <typename T>
inline typename std::remove_reference<T>::type&& move(T& t) {
return std::move(t);
}
template <typename T>
inline typename std::remove_reference<T>::type&& move(T&& t) {
return std::move(t);
}
} // namespace polyfill
"""
cdef T move[T](T)
# distutils: language = c++
cdef extern from *:
"""
#include <iostream>
#define PRINT() std::cout << __PRETTY_FUNCTION__ << std::endl
struct Test {
Test() { PRINT(); }
~Test() { PRINT(); }
Test(const Test&) { PRINT(); }
Test(Test&&) { PRINT(); }
Test& operator=(const Test&) { PRINT(); return *this; }
Test& operator=(Test&&) { PRINT(); return *this; }
};
void f(const Test&) { PRINT(); }
void f(Test&&) { PRINT(); }
"""
cdef cppclass Test:
pass
cdef void f(Test)
from move cimport move
cdef Test t1, t2
print("# t1 = t2")
t1 = t2
print("# t1 = move(t2)")
t1 = move(t2)
print("# f(t1)")
f(t1)
print("# f(move(t1))")
f(move(t1))
print("# f(move(move(t1)))")
f(move(move(t1)))
print("# f(move(move(move(t1))))")
f(move(move(move(t1))))
cythonize -3 -i test.pyx
和 Cython 0.29.12 和 Python 3.7.3 编译):
$ python3 -c "import test"
Test::Test()
Test::Test()
# t1 = t2
Test& Test::operator=(const Test&)
# t1 = move(t2)
Test& Test::operator=(Test&&)
# f(t1)
void f(const Test&)
# f(move(t1))
void f(Test&&)
# f(move(move(t1)))
void f(Test&&)
# f(move(move(move(t1))))
void f(Test&&)
Test::~Test()
Test::~Test()
关于c++11 - Cython:避免通过 std::move 复制不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29571780/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!