Боюсь, что cppyy старается быть наполовину слишком умным, всегда интерпретируя char16_t*
как строку Python Unicode (включая спецификацию и кодировку Python, указанную c) и не видит ее как низкоуровневый массив или выходной параметр. Я, возможно, могу исправить / улучшить кое-что из этого, но сейчас есть обходной путь, который поможет вам преодолеть этот пункт:
import cppyy
import cppyy.ll
cppyy.cppdef("""
int func1_wrap(const char16_t* symbol, void* data, const unsigned int length) {
return func1(symbol, (char16_t*)data, length);
}
""")
def func1_pywrap(symbol, length):
buf = cppyy.ll.array_new[cppyy.gbl.uint16_t](length)
res = cppyy.gbl.func1_wrap(symbol, buf, length)
return res, cppyy.ll.cast['char16_t*'](buf)
cppyy.gbl.func1 = func1_pywrap
result = cppyy.gbl.func1('Keyname', 5)
print(result)
Различные броски просто делают слепой слепым тот факт, с которым он имеет дело строка в кодировке Юникод, и просто заставьте ее передавать указатели.