Передать блок Ruby как аргумент в СXX-extension?

207
21 апреля 2018, 19:25

Нужно в CXX-extension объявить метод, который принимал бы блок Ruby (чтобы прогресс задачи отслеживать). Использую биндинги RICE. Вот есть метод класса в C++:

String PieceMaker::makeHash(void onProgress(int, int));

Я хочу из Ruby передавать ему блок:

pm.make_hash do |done, total|
  # code goes here
end

Но при компиляции расширения Rice не знает, как кастовать аргумент:

~/.rvm/gems/ruby-2.5.1/gems/rice-2.1.2/ruby/lib/include/rice/detail/../detail/Caster.hpp:36:54: error: invalid static_cast from type void*’ to type void (*)(int, int)’
   Derived_T * d(static_cast<Derived_T *>(derived));
                                                  ^
~/.rvm/gems/ruby-2.5.1/gems/rice-2.1.2/ruby/lib/include/rice/detail/../detail/Caster.hpp:37:37: error: invalid static_cast from type void (*)(int, int)’ to type void*’
   return static_cast<Base_T *>(d);
                                 ^

Если возможность есть, но только в оригинальных C-биндингах - готов перейти.

READ ALSO
Создание двумерного массива C++

Создание двумерного массива C++

создаю, заполняю и вывожу двумерные массивыНо почему-то числа в первой строке и в первом столбце одинаковые

217
Счётчик правильных ответов [требует правки]

Счётчик правильных ответов [требует правки]

У меня имеется программа - тестирование,в которой 10 вопросовКаждый вопрос в отдельной форме

180
Продлить жизнь конструктора

Продлить жизнь конструктора

В конструкторе инициализируются локальные переменныеХотелось бы использовать их в других методах класса, какие есть методы решения данной...

149
OpenGL переполнение VBO c++

OpenGL переполнение VBO c++

Есть функция:

288