Я хотел бы вызвать функцию Джулии из C ++. Эта функция Julia принимает в качестве аргумента другую функцию Julia (функцию обратного вызова). Я хотел бы написать эту функцию обратного вызова полностью на C ++ и передать ее непосредственно Джулии, не объявляя имя для нее в пространстве имен Джулии, например, как передаются другие примитивные типы. Предположительно аргументы моей реализации C ++ функции обратного вызова будут иметь jl_value_t *
как их типы.
Кто-нибудь может привести пример того, как это сделать? встроенный пример Юлии довольно хорошо, но это, похоже, не иллюстрирует этот случай.
Обновление: пересмотрено и уточнено на основе ответа Якка.
Пример охватывает этот случай.
Здесь мы вызываем функцию c:
jl_eval_string("println( ccall( :my_c_sqrt, Float64, (Float64,), 2.0 )
Который определяется в верхней части примера.
В другом месте есть пример определения функции Джулия. Определите тот, который делает ccall
в ваш код c.
jl_eval_string("my_func(x) = 2*x");
(Кроме как вместо 2*x
оно делает ccall(blah)
).
Возьмите эту функцию julia и получите указатель на нее (также в вашем связанном примере).
jl_function_t *func = jl_get_function(jl_base_module, "reverse!");
И передать его функции julia, ожидающей обратного вызова. Или используйте eval, чтобы передать его по имени.
Код C ++ будет передан double
с и тому подобное с этим планом.
Других решений пока нет …