Как вызвать функцию с аргументом std::ostream&, используя cppyy?

Я пробовал делать

import io

output = io.StringIO()

CPP_FUNCTION(output)

print(output.getvalue())

Но я получаю

TypeError: void CPP_FUNCTION(std::ostream& outputstream) =>
    TypeError: could not convert argument 1
cppyy.readthedocs.io/en/latest/… -- похоже, вам не повезло. В зависимости от того, что вам нужно, вы, вероятно, можете использовать файловые дескрипторы (тип int, например stdin, stdout, stderr) и/или использовать многопроцессорность и перенаправить ввод/вывод. Может быть, вы также можете написать какой-нибудь связующий код на C++, который адаптируется между Python StringIO и C++ streambuf, чтобы это заработало.
Ulrich Eckhardt 10.01.2023 22:54

О, нет! @WimLavrijsen, пожалуйста, спаси меня

shouriha 10.01.2023 22:58

Привет, @shourinha. Пожалуйста, поделитесь с нами определением StringIO() важно знать, что возвращает этот метод.

Jorge Omar Medra 10.01.2023 23:00

Это встроенная функция Python, @JorgeOmarMedra!?

Ulrich Eckhardt 10.01.2023 23:00

@JorgeOmarMedra CPP_FUNCTION возвращает void, если это то, о чем вы спрашиваете. StringIO() имеет тип _io.StringIO

shouriha 10.01.2023 23:02

Это может вам помочь: bitbucket.org/wlav/cppyy/issues/256/…

Jorge Omar Medra 10.01.2023 23:04

Jorge Omar Medra 10.01.2023 23:06
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
0
7
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это то, что Хорхе сказал в комментариях: чтобы функция 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())

Другие вопросы по теме