Я пробовал делать
import io
output = io.StringIO()
CPP_FUNCTION(output)
print(output.getvalue())
Но я получаю
TypeError: void CPP_FUNCTION(std::ostream& outputstream) =>
TypeError: could not convert argument 1
О, нет! @WimLavrijsen, пожалуйста, спаси меня
Привет, @shourinha. Пожалуйста, поделитесь с нами определением StringIO() важно знать, что возвращает этот метод.
Это встроенная функция Python, @JorgeOmarMedra!?
@JorgeOmarMedra CPP_FUNCTION возвращает void, если это то, о чем вы спрашиваете. StringIO() имеет тип _io.StringIO
Это может вам помочь: bitbucket.org/wlav/cppyy/issues/256/…
Это то, что Хорхе сказал в комментариях: чтобы функция C++, использующая ostream, работала, вам нужно будет предоставить объект, который реализует C++ ostream. io.StringIO() Python не имеет отношения к std::ostream. На самом деле они даже не используют один и тот же базовый тип данных для своих буферов, поэтому невозможно построить один интерфейс поверх другого.
Что вы можете сделать, так это захватить вещи способом С++, затем извлечь строку и преобразовать. Это происходит за счет дополнительной копии (если, конечно, необходимый результат не является std::string, который должен быть передан другой функции C++, и в этом случае преобразование не требуется).
Пример кода:
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())
int
, напримерstdin
,stdout
,stderr
) и/или использовать многопроцессорность и перенаправить ввод/вывод. Может быть, вы также можете написать какой-нибудь связующий код на C++, который адаптируется между PythonStringIO
и C++streambuf
, чтобы это заработало.