bind.h(開発中)

bind.hのC++ APIは以下を定義します。

このAPIのガイドドキュメントは、Embindにあります。

このAPIの使い方

定義

EMSCRIPTEN_BINDINGS(name)

この定義は、C++クラス、関数、その他の構成要素をJavaScriptにバインドするために使用されます。マッピングされる構成要素に応じて異なる方法で使用されます。例については、embindガイドを参照してください。

パラメータ

name – これは、関連するバインディングのグループをマークするためのラベルです(例:EMSCRIPTEN_BINDINGS(physics)EMSCRIPTEN_BINDINGS(components)など)。

type sharing_policy
type sharing_policy::NONE
type sharing_policy::INTRUSIVE
type sharing_policy::BY_EMVAL

ポリシー

現在、allow_raw_pointersポリシーのみがサポートされています。将来的には、オブジェクトの所有権を管理するためのBoost.Pythonのようなrawポインタポリシーを実装したいと考えています。

type arg
static int index
// Prototype
static constexpr int index
type ret_val
static int index
// Prototype
static constexpr int index
type allow_raw_pointers

このポリシーは、rawポインタを許可するために使用されます。

type Transform::type
type allow_raw_pointer

select_overloadとselect_const

typename std::add_pointer<Signature>::type select_overload(typename std::add_pointer<Signature>::type fn)
// Prototype
template<typename Signature>
typename std::add_pointer<Signature>::type select_overload(typename std::add_pointer<Signature>::type fn)
パラメータ

typename std::add_pointer<Signature>::type fn

typename internal::MemberFunctionType<ClassType, Signature>::type select_overload()
// Prototype
template<typename Signature, typename ClassType>
typename internal::MemberFunctionType<ClassType, Signature>::type select_overload(Signature (ClassType::*fn))
パラメータ

Signature (ClassType::*fn)

auto select_const()
// Prototype
template<typename ClassType, typename ReturnType, typename... Args>
auto select_const(ReturnType (ClassType::*method)(Args...) const)
パラメータ

ReturnType (ClassType::*method)(Args...) const

typename internal::CalculateLambdaSignature<LambdaType>::type optional_override(const LambdaType &fp)
// Prototype
template<typename LambdaType>
typename internal::CalculateLambdaSignature<LambdaType>::type optional_override(const LambdaType& fp)
パラメータ

const LambdaType& fp

関数

void function()
//prototype
template<typename ReturnType, typename... Args, typename... Policies>
void function(const char* name, ReturnType (*fn)(Args...), Policies...)

JavaScriptにエクスポートする関数を登録します。これは、EMSCRIPTEN_BINDINGS()ブロック内から呼び出されます。

たとえば、関数lerp()をエクスポートするには

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

using namespace emscripten;

float lerp(float a, float b, float t) {
   return (1 - t) * a + t * b;
}

EMSCRIPTEN_BINDINGS(my_module) {
   function("lerp", &lerp);
}
パラメータ
  • const char* name – エクスポートする関数の名前(例:"lerp")。

  • ReturnType (*fn)(Args...) – エクスポートされた関数の関数ポインタのアドレス(例:&lerp)。

  • Policies... – rawポインタのオブジェクトの所有権を管理するためのポリシー。現在は、allow_raw_pointersである必要があります。

値タプル

class value_array : public internal::noncopyable
type class_type

クラスのテンプレート型である ClassType の typedef。

value_array(const char *name)

コンストラクタ。

パラメータ

const char* name

~value_array()

デストラクタ。

value_array &element(ElementType InstanceType::*field)
パラメータ

ElementType InstanceType::*fieldElementTypeInstanceType は型名(テンプレート型)であることに注意してください。

value_array &element(Getter getter, Setter setter)
パラメータ
  • Getter getterGetter は型名(テンプレート型)であることに注意してください。

  • Setter setterSetter は型名(テンプレート型)であることに注意してください。

value_array &element(index<Index>)
パラメータ

index<Index>Index は整数テンプレートパラメータであることに注意してください。

値構造体

class value_object : public internal::noncopyable
type class_type

クラスのテンプレート型である ClassType の typedef。

value_object(const char *name)

コンストラクタ。

パラメータ

const char* name

~value_object()

デストラクタ。

value_object &field(const char *fieldName, FieldType InstanceType::*field)
パラメータ
  • const char* fieldName

  • FieldType InstanceType::*field

value_object &field(const char *fieldName, Getter getter, Setter setter)
パラメータ
  • const char* fieldName

  • Getter getterGetter は型名(テンプレート型)であることに注意してください。

  • Setter setterSetter は型名(テンプレート型)であることに注意してください。

value_object &field(const char *fieldName, index<Index>)
パラメータ
  • const char* fieldName

  • index<Index>Index は整数テンプレートパラメータであることに注意してください。

スマートポインタ

type default_smart_ptr_trait
//prototype
template<typename PointerType>
struct default_smart_ptr_trait
static sharing_policy get_sharing_policy()
static void *share(void *v)
パラメータ

void* v

static PointerType *construct_null()
戻り値

返される PointerType は型名(テンプレート型)であることに注意してください。

type smart_ptr_trait
//prototype
template<typename PointerType>
struct smart_ptr_trait : public default_smart_ptr_trait<PointerType>
typedef PointerType::element_type element_type
//prototype
typedef typename PointerType::element_type element_type;

PointerType は型名(テンプレート型)であり、その PointerType::element_type の typedef です。

static element_type *get(const PointerType &ptr)
パラメータ

const PointerType& ptrPointerType は型名(テンプレート型)であることに注意してください

template<typename PointeeType>
using smart_ptr_trait<std::shared_ptr<PointeeType>>
//prototype
template<typename PointeeType>
struct smart_ptr_trait<std::shared_ptr<PointeeType>>
type PointerType

PointeeType は型名(テンプレート型)であり、std::shared_ptr<PointeeType> の typedef です。

type element_type

PointerType::element_type の typedef です。

static element_type *get(const PointerType &ptr)
パラメータ

const PointerType& ptr

static sharing_policy get_sharing_policy()
static std::shared_ptr<PointeeType> *share(PointeeType *p, EM_VAL v)
パラメータ
  • PointeeType* pPointeeType は型名(テンプレート型)であることに注意してください。

  • EM_VAL v

static PointerType *construct_null()

クラス

class wrapper : public T, public internal::WrapperBase
//prototype
template<typename T>
class wrapper : public T, public internal::WrapperBase
type class_type

クラスのテンプレート型である T の typedef。

wrapper(val &&wrapped, Args&&... args)
//prototype
template<typename... Args>
explicit wrapper(val&& wrapped, Args&&... args)
  : T(std::forward<Args>(args)...)
  , wrapped(std::forward<val>(wrapped))

コンストラクタ。

パラメータ
  • val&& wrapped

  • Args&&... argsArgs は型名(テンプレート型)であることに注意してください。

~wrapper()

デストラクタ。

ReturnType call(const char *name, Args&&... args) const

コンストラクタ。

パラメータ
  • const char* name

  • Args&&... argsArgs は型名(テンプレート型)であることに注意してください。

戻り値

ReturnType は型名(テンプレート型)であることに注意してください。

EMSCRIPTEN_WRAPPER(T)
パラメータ

T

type base
type class_type

BaseClass の typedef であり、クラスのテンプレート型の型名です。

static void verify()

型名 ClassType を取るテンプレート関数であることに注意してください。

static internal::TYPEID get()
template<typename ClassType>
using Upcaster = BaseClass* (*)(ClassType*);

template<typename ClassType>
using Downcaster = ClassType* (*)(BaseClass*);
static Upcaster<ClassType> getUpcaster()
//prototype
template<typename ClassType>
static Upcaster<ClassType> getUpcaster()
static Downcaster<ClassType> getDowncaster()
//prototype
template<typename ClassType>
static Downcaster<ClassType> getDowncaster()
static To *convertPointer(From *ptr)
//prototype
template<typename From, typename To>
static To* convertPointer(From* ptr)
パラメータ

From* ptr

type pure_virtual
type Transform

これは、型名パラメータ InputType と整数 Index を取るテンプレート構造体であることに注意してください。

type type

これは、親構造体の型名パラメータ InputType への typedef です。

type constructor

これは、型名 ... ConstructorArgs を取るテンプレート構造体であることに注意してください。

class class_

これは、型名パラメータ ClassTypeBaseSpecifier を持つテンプレートクラスであることに注意してください。

type class_type

ClassType (クラスの型名)の typedef です。

type base_specifier

BaseSpecifier (クラスの型名)の typedef です。

type HELPNEEDEDHERE
class_() = delete;
explicit class_(const char *name)
//prototype
EMSCRIPTEN_ALWAYS_INLINE explicit class_(const char* name)

コンストラクタ。

パラメータ

const char* name

const class_ &smart_ptr(const char *name) const
//prototype
template<typename PointerType>
EMSCRIPTEN_ALWAYS_INLINE const class_& smart_ptr(const char* name) const
パラメータ

const char* name

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

const class_ &constructor() const
//prototype
template<typename... ConstructorArgs, typename... Policies>
EMSCRIPTEN_ALWAYS_INLINE const class_& constructor(Policies... policies) const

クラスコンストラクタの引数なし形式。これにより、テンプレートで指定された引数を持つ自然なコンストラクタが呼び出されます。詳細については、外部コンストラクタを参照してください。

パラメータ

Policies... policies – 生ポインタオブジェクトの所有権を管理するためのポリシー。現在、allow_raw_pointersである必要があります。

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

const class_ &constructor(Callable callable, Policies...) const
//prototype
template<typename Signature = internal::DeduceArgumentsTag, typename Callable, typename... Policies>
EMSCRIPTEN_ALWAYS_INLINE const class_& constructor(Callable callable, Policies...) const

オブジェクトを作成するためにファクトリ関数を使用するオブジェクトのクラスコンストラクタ。このメソッドは、関数ポインタ、std::function オブジェクト、または新しく構築されたオブジェクトを返す関数オブジェクトを受け入れます。Callable が関数オブジェクトの場合、関数シグネチャは、ReturnType (Args...) の形式で Signature テンプレートパラメータで明示的に指定する必要があります。関数オブジェクト以外の Callable 型の場合、メソッドシグネチャが推論されます。

以下は、constructor のすべての有効な呼び出しです。

using namespace std::placeholders;
myClass1.constructor(&my_factory);
myClass2.constructor(std::function<ClassType2(float, float)>(&class2_factory));
myClass3.constructor<ClassType3(const val&)>(std::bind(Class3Functor(), _1));

詳細については、外部コンストラクタを参照してください。

パラメータ
  • Callable callableCallable は、メンバー関数ポインタ、関数ポインタ、std::function、または関数オブジェクトのいずれかである可能性があることに注意してください。

  • Policies... policies – 生ポインタオブジェクトの所有権を管理するためのポリシー。現在、allow_raw_pointersである必要があります。

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

const class_ &smart_ptr_constructor() const
//prototype
template<typename SmartPtr, typename... Args, typename... Policies>
EMSCRIPTEN_ALWAYS_INLINE const class_& smart_ptr_constructor(const char* smartPtrName, SmartPtr (*factory)(Args...), Policies...) const
パラメータ
  • const char* smartPtrName

  • SmartPtr (*factory)(Args...)

  • Policies... policies – 生ポインタオブジェクトの所有権を管理するためのポリシー。現在、allow_raw_pointersである必要があります。

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

const class_ &allow_subclass() const
//prototype
 template<typename WrapperType, typename PointerType, typename... ConstructorArgs>
EMSCRIPTEN_ALWAYS_INLINE const class_& allow_subclass(
  const char* wrapperClassName,
  const char* pointerName,
  ::emscripten::constructor<ConstructorArgs...> = ::emscripten::constructor<>()
) const
パラメータ
  • const char* wrapperClassName

  • const char* pointerName

  • emscripten::constructor<ConstructorArgs...> constructor)

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

const class_ &allow_subclass(const char *wrapperClassName, emscripten::constructor<ConstructorArgs...> constructor) const
//prototype
template<typename WrapperType, typename... ConstructorArgs>
EMSCRIPTEN_ALWAYS_INLINE const class_& allow_subclass(
  const char* wrapperClassName,
  ::emscripten::constructor<ConstructorArgs...> constructor = ::emscripten::constructor<>()
) const
パラメータ
  • const char* wrapperClassName

  • ::emscripten::constructor<ConstructorArgs...> constructor)

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

const class_ &function() const
//prototype
template<typename Signature = internal::DeduceArgumentsTag, typename Callable, typename... Policies>
EMSCRIPTEN_ALWAYS_INLINE const class_& function(const char* methodName, Callable callable, Policies...) const

このメソッドは、クラスに属するメソッドを宣言するためのものです。

JavaScript側では、これはプロトタイプのプロパティとしてバインドされる関数です。例えば、.function("myClassMember", &MyClass::myClassMember) は、JavaScript の MyClass.prototype.myClassMembermyClassMember をバインドします。このメソッドは、メンバ関数へのポインタ、関数ポインタ、std::function オブジェクト、または関数オブジェクトのいずれかを受け入れます。Callable がメンバ関数へのポインタではない場合、最初の(this)パラメータとして ClassType を受け入れる必要があります。Callable が関数オブジェクトの場合、関数シグネチャは ReturnType (Args...) の形式で Signature テンプレートパラメータで明示的に指定する必要があります。関数オブジェクト以外の Callable 型の場合、メソッドシグネチャは推論されます。

人間が読める既知のシンボル形式(例えば、@@iterator)で指定されたメソッド名は、JavaScript の名前付き Symbol(例えば、Symbol.iterator)を使用してバインドされます。

以下はすべて、function への有効な呼び出しです。

using namespace std::placeholders;
myClass.function("myClassMember", &MyClass::myClassMember)
    .function("myFreeFunction", &my_free_function)
    .function("myStdFunction", std::function<float(ClassType&, float, float)>(&my_function))
    .function<val(const MyClass&)>("myFunctor", std::bind(&my_functor_taking_this, _1));
パラメータ
  • const char* methodName

  • Callable callableCallable は、メンバー関数ポインタ、関数ポインタ、std::function、または関数オブジェクトのいずれかである可能性があることに注意してください。

  • typename... Policies – 生ポインタオブジェクトの所有権を管理するためのポリシー。現在は、allow_raw_pointersである必要があります。

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

const class_ &property() const
//prototype
template<typename FieldType, typename = typename std::enable_if<!std::is_function<FieldType>::value>::type>
EMSCRIPTEN_ALWAYS_INLINE const class_& property(const char* fieldName, const FieldType ClassType::*field) const
パラメータ
  • const char* fieldName

  • const FieldType ClassType::*field

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

const class_ &property(const char *fieldName, FieldType ClassType::*field) const
//prototype
template<typename FieldType, typename = typename std::enable_if<!std::is_function<FieldType>::value>::type>
EMSCRIPTEN_ALWAYS_INLINE const class_& property(const char* fieldName, FieldType ClassType::*field) const
パラメータ
  • const char* fieldName

  • FieldType ClassType::*field

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

const class_ &property(const char *fieldName, Getter getter) const
//prototype
template<typename PropertyType = internal::DeduceArgumentsTag, typename Getter>
EMSCRIPTEN_ALWAYS_INLINE const class_& property(const char* fieldName, Getter getter) const;

指定された getter を使用してプロパティの値を取得し、クラスの指定された fieldName を持つ読み取り専用のプロパティを宣言します。Getter は、クラスメソッド、関数、std::function、または関数オブジェクトのいずれかです。Getter がメンバ関数へのポインタではない場合、this 引数として ClassType のインスタンスを受け入れる必要があります。Getter が関数オブジェクトの場合、プロパティ型は推論できないため、myClass.property<int>("myIntProperty", MyIntGetterFunctor()); のようにテンプレートパラメータとして指定する必要があります。

パラメータ
  • const char* fieldName

  • Getter getterGetter は関数テンプレートの型名であることに注意してください。

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

const class_ &property(const char *fieldName, Getter getter, Setter setter) const
//prototype
template<typename PropertyType = internal::DeduceArgumentsTag, typename Getter, typename Setter>
EMSCRIPTEN_ALWAYS_INLINE const class_& property(const char* fieldName, Getter getter, Setter setter) const

これは型名 Setter および Getter を取る関数テンプレートです。 template<typename Getter, typename Setter> は、クラスの指定された fieldName を持つ読み取り/書き込み可能なプロパティを宣言します。Getter および Setter は、クラスメソッド、関数、std::function、または関数オブジェクトのいずれかです。Getter または Setter がメンバ関数へのポインタではない場合、this 引数として ClassType のインスタンスを受け入れる必要があります。Getter または Setter が関数オブジェクトの場合、プロパティ型は推論できないため、myClass.property<int>("myIntProperty", MyIntGetterFunctor(), MyIntSetterFunctor()); のようにテンプレートパラメータとして指定する必要があります。

パラメータ
  • const char* fieldName

  • Getter getterGetter は関数テンプレートの型名であることに注意してください。

  • Setter setterSetter は関数テンプレートの型名であることに注意してください。

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

const class_ &class_function() const
//prototype
template<typename ReturnType, typename... Args, typename... Policies>
EMSCRIPTEN_ALWAYS_INLINE const class_& class_function(const char* methodName, ReturnType (*classMethod)(Args...), Policies...) const

このメソッドは、クラスに属する静的関数を宣言するためのものです。

JavaScript側では、これはコンストラクタのプロパティとしてバインドされる関数です。例えば、.class_function("myStaticFunction", &MyClass::myStaticFunction) は、myStaticFunctionMyClass.myStaticFunction にバインドします。

人間が読める既知のシンボル形式(例えば、@@species)で指定されたメソッド名は、JavaScript の名前付き Symbol(例えば、Symbol.species)を使用してバインドされます。

パラメータ
  • const char* methodName

  • ReturnType (*classMethod)(Args...)

  • Policies... – rawポインタのオブジェクトの所有権を管理するためのポリシー。現在は、allow_raw_pointersである必要があります。

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

const class_ &class_property(const char *fieldName, FieldType *field) const
//prototype
template<typename FieldType>
EMSCRIPTEN_ALWAYS_INLINE const class_& property(const char* fieldName, FieldType *field) const
パラメータ
  • const char* fieldName

  • FieldType ClassType::*field

戻り値

現在のオブジェクトへの const 参照。これにより、EMSCRIPTEN_BINDINGS() ブロックでバインディングを定義する class_ 関数のチェーンが可能になります。

ベクター

class_<std::vector<T>> register_vector(const char *name)
//prototype
template<typename T>
class_<std::vector<T>> register_vector(const char* name)

std::vector<T> を登録する関数。

パラメータ

const char* name

マップ

class_<std::map<K, V>> register_map(const char *name)
//prototype
template<typename K, typename V>
class_<std::map<K, V>> register_map(const char* name)

std::map<K, V> を登録する関数。

パラメータ

const char* name

列挙型

class enum_
//prototype
template<typename EnumType>
class enum_

JavaScript にエクスポートする列挙型を登録します。これは、EMSCRIPTEN_BINDINGS() ブロック内から呼び出され、C++98 列挙型と C++11 「列挙型クラス」の両方で動作します。詳細については、列挙型を参照してください。

type enum_type

EnumType (クラスの型名)の typedef。

enum_(const char *name)

コンストラクタ。

パラメータ

const char* name

enum_ &value(const char *name, EnumType value)

列挙値を登録します。

パラメータ
  • const char* name – 列挙値の名前。

  • EnumType value – 列挙値の型。

戻り値

現在のオブジェクトへの参照。これにより、EMSCRIPTEN_BINDINGS() ブロック内で複数の列挙値を連鎖させることができます。

定数

void constant(const char *name, const ConstantType &v)
//prototype
template<typename ConstantType>
void constant(const char* name, const ConstantType& v)

JavaScriptにエクスポートする定数を登録します。これは、EMSCRIPTEN_BINDINGS() ブロック内で呼び出されます。

EMSCRIPTEN_BINDINGS(my_constant_example) {
  constant("SOME_CONSTANT", SOME_CONSTANT);
}
パラメータ
  • const char* name – 定数の名前。

  • const ConstantType& v – 定数の型。これはembindで認識される任意の型にできます。