Emscripten Class Constructor Принимая std :: vector <T> - PullRequest
0 голосов
/ 01 ноября 2018

Мне было интересно, может ли кто-нибудь помочь мне с привязкой для класса C ++, который принимает в качестве конструктора std::vector<T> в Emscripten. Я хотел бы что-то вроде следующего:

EMSCRIPTEN_BINDINGS(my_class) {

    emscripten::class_<test_class>("test_class")
        .constructor<std::vector<float>>()
        .property("x", &test_class::get_x, &test_class::set_x)
        ;
}

Я прочитал этого поста и реализовал прокси-функцию для переноса моего массива с плавающей запятой JS, созданного var inputArray = new Float32Array([1,2,3], в std::vector<float>.

Однако, когда я использую inputArray в качестве параметра для конструктора класса, я получаю следующее предупреждение:

5258048 - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.

Я добавил флаг DISABLE_EXCEPTION_CATCHING=2 к шагу emcc, однако это не дает никакого другого результата.

Кто-нибудь еще придумал решение?

1 Ответ

0 голосов
/ 21 ноября 2018

Главное - убедиться, что вы определили отображение для std :: vector с помощью register_vector, чтобы вы могли передать вектор, созданный вашей функцией копирования, обратно в JavaScript, а затем обратно в C ++.

Мне кажется, этот код работает, если я правильно понимаю вашу проблему:

#include <vector>

#include <emscripten.h>
#include <emscripten/bind.h>

class test_class {
    float x;

public:
    test_class(std::vector<float> arr);
    float get_x() const;
    void set_x(float val);
};

test_class::test_class(std::vector<float> arr) {
    x = 0;
    for (size_t i = 0; i < arr.size(); i++) {
        x += arr[i];
    }
    x = x / arr.size();
}

float test_class::get_x() const {
    return x;
}

void test_class::set_x(float val) {
    x = val;
}

EMSCRIPTEN_BINDINGS(my_class) {

    emscripten::register_vector<float>("VectorFloat");

    emscripten::class_<test_class>("test_class")
        .constructor<std::vector<float>>()
        .property("x", &test_class::get_x, &test_class::set_x)
        ;
}

int main() {
    EM_ASM(
        var arr = new Float32Array([1.0, 2.0, 0.5]);
        var vec = new Module.VectorFloat();
        for (var i = 0; i < arr.length; i++) {
            vec.push_back(arr[i]);
        }
        var obj = new Module.test_class(vec);
        console.log('obj.x is ' + obj.x);
    );
}

Этот пример кода делает неэффективное копирование из Float32Array в std :: vector (представленный как прокси-объект VectorFloat в JS), предполагая, что эта часть работает, и концентрируется на передаче вектора в конструктор.

...