Embind C++クラスemscripten::val
(val.hで定義)は、JavaScriptコードをC++に書き換えるために使用されます。
このクラスのガイド資料は、valを使用してJavaScriptをC++に書き換えるにあります。
emscripten::
val
¶このクラスは、任意のJavaScriptオブジェクトを表現(および便利なアクセスを提供)するために使用できるC++データ型です。これを使用して、JavaScriptオブジェクトを呼び出したり、そのプロパティを読み書きしたり、bool
、int
、std::string
のようなC++値に強制的に変換したりできます。
たとえば、以下のコードは、URLでXHRリクエストを行うためのいくつかの簡単なJavaScriptを示しています。
var xhr = new XMLHttpRequest;
xhr.open("GET", "http://url");
同じコードは、グローバルXMLHttpRequest
オブジェクトのシンボルを取得するためにglobal()
を使用し、それを使用してURLを開くことにより、C++で記述できます。
val xhr = val::global("XMLHttpRequest").new_();
xhr.call<void>("open", std::string("GET"), std::string("http://url"));
オブジェクトプロパティを読み取るにはoperator[]()
を使用し、型を強制的に変換するにはas()
を使用して、open
メソッドの呼び出しが成功したかどうかをテストできます。
const char* state;
switch (xhr["readyState"].as<int>()) {
case 0:
state = "UNSENT"; break;
case 1:
state = "OPENED"; break;
default:
state = "etc";
}
他の例については、valを使用してJavaScriptをC++に書き換えるを参照してください。
警告
JavaScriptの値はスレッド間で共有できないため、それらをバインドするval
インスタンスも共有できません。
たとえば、JavaScriptのグローバル変数をval
としてキャッシュする場合は、各スレッドで名前によってグローバル変数の個別のインスタンスを取得してバインドする必要があります。これを行う最も簡単な方法は、thread_local
宣言を使用することです。
thread_local const val Uint8Array = val::global("Uint8Array");
as_handle
() const¶このval
を表す生のハンドルを返します。これは、JavaScriptに生の値ハンドルを渡し、Emval.toValue
関数を介して反対側で値を取得するために使用できます。例
EM_JS(void, log_value, (EM_VAL val_handle), {
var value = Emval.toValue(val_handle);
console.log(value); // 42
});
val foo(42);
log_value(foo.as_handle());
take_ownership
(EM_VAL e)¶生のハンドルからval
を作成します。これは、JavaScriptから値を取得するために使用できます。JavaScript側では、値をEmval.toHandle
でラップし、C++に渡し、C++ではtake_ownership
を使用してval
インスタンスに変換できます。例
EM_ASYNC_JS(EM_VAL, fetch_json_from_url, (const char *url), {
var url = UTF8ToString(url);
var response = await fetch(url);
var json = await response.json();
return Emval.toHandle(json);
});
val obj = val::take_ownership(fetch_json_from_url("https://httpbin.org/json"));
std::string author = obj["slideshow"]["author"].as<std::string>();
val
(T &&value)¶コンストラクター。
Embind互換のC++型から変換してval
を作成します。例えば、val(true)
やval(std::string("foo"))
のように使用します。
val
(const char *v)¶文字列リテラルからval
インスタンスを構築します。
~val
()¶参照カウントを減らすことで、現在バインドされている値を削除します。
hasOwnProperty
(const char *key) const¶JavaScriptオブジェクトが、指定された名前の独自の(継承されていない)プロパティを持っているかどうかを確認します。
new_
(Args&&... args) const¶現在の値がコンストラクターであると仮定し、そのインスタンスを作成します。JavaScriptの式new currentValue(…)と同等です。
call
(const char *name, Args&&... args) const¶現在のオブジェクトに対して、指定されたメソッド(name
)を、提供された引数で呼び出します。
as
() const¶現在の値を指定されたC++型に変換します。
vecFromJSArray
(const val &v)¶JavaScript配列をstd::vector<T>
にコピーし、各要素を.as<T>()
を使用して変換します。数値を使用する、より効率的だが安全でないバージョンについては、convertJSArrayToNumberVector
を参照してください。
val v – コピーするJavaScript配列
javascript配列から作成されたstd::vector<T>
convertJSArrayToNumberVector
(const val &v)¶JavaScript配列を、各要素に対してjavascriptのNumber()関数を使用するように、効率的にstd::vector<T>
に変換します。これは、2つ以上の値を持つ配列ではvecFromJSArray
よりもはるかに効率的ですが、数値以外の値の配列には適していません。型チェックは行われないため、無効な配列エントリは、NaN値(または整数型の場合は0)に置き換えられます。
val v – コピーするJavaScript(型付き)配列
javascript配列から作成されたstd::vector<T>
await
() const¶Promise
/thenable をawait
するために、C++を一時停止します。
完了した値。
注意
このメソッドでは、ASYNCIFYを有効にする必要があります。
operator co_await
() const¶co_await
演算子を使用すると、val
で表されるJavaScriptのPromiseを待機できます。
これは、C++20のコルーチンと互換性がありますが、通常は、Promise
にもなるval
を返すコルーチン内で使用する必要があります。
例えば、このJavaScriptのasync
/await
関数と同等のものを実装することができます。
async function foo() { const response = await fetch("http://url"); const json = await response.json(); return json; } export { foo };C++コルーチンとして。
val foo() { val response = co_await val::global("fetch")(std::string("http://url")); val json = co_await response.call<val>("json"); return json; } EMSCRIPTEN_BINDINGS(module) { function("foo", &foo); }
await()
メソッドとは異なり、ネイティブなC++コルーチン変換を使用するため、Asyncifyは必要ありません。
このPromiseの完了値を表すval
。