c++ 如何使用cppyy调用一个带有std::ostream&参数的函数?

lnlaulya  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(152)

我正在为一个原生c++项目使用cppyy,我有一个接受std::ostream&对象的函数,我不知道如何创建从python调用它的东西。
我试过

import io

output = io.StringIO()

CPP_FUNCTION(output)

print(output.getvalue())

但我得到了

TypeError: void CPP_FUNCTION(std::ostream& outputstream) =>
    TypeError: could not convert argument 1
vwoqyblh

vwoqyblh1#

正是豪尔赫在评论中所说的:对于一个接受ostream的C函数,你必须提供一个实现Costream的对象。Python的io.StringIO()std::ostream没有关系。事实上,两者甚至没有使用相同的底层数据类型作为缓冲区,所以不可能在另一个接口之上构建一个接口。
你能做的就是用C的方式捕获东西,然后提取字符串并进行转换,这是以额外的拷贝为代价的(当然,除非所需的结果实际上是要传递给另一个C函数的std::string,在这种情况下不需要转换)。
示例代码:

import cppyy

cppyy.cppdef(r"""\
void example(std::ostream& outputstream) {
    outputstream << "Hello, World!";
}""")

output = cppyy.gbl.std.ostringstream()

cppyy.gbl.example(output)

# str() creates a std::string; converted to Python str by print()
print(output.str())

相关问题