C++でClass#allocateを登録する

VALUE rb_cUserDefined;

/* … */

VALUE
your_class_singleton_allocate(VALUE klass) {
  VALUE allocated;
  
  /* … */
  
  return allocated;
}

/* … */

#ifdef __cplusplus
extern "C" {
#endif
  void
  Init_your_ext(void) {
    /* … */
    rb_cUserDefined = rb_define_class("YourClass", rb_cObject);
    /* … */
    rb_define_alloc_func(rb_cUserDefined, reinterpret_cast<VALUE (*)(VALUE)>(your_class_singleton_allocate));
    /* … */
  }
#ifdef __cplusplus
}
#endif

型名の解決が良く分からないけど…色々やってみた結果「VALUE (*)(VALUE)」が通った.

ちなみに「rb_define_alloc_func」はintern.h(実装はeval.c)で定義されていた(最初からこちらを見ればよかったけど,ruby.hに無かったのでトライ&エラーを優先して探すのを後回しにした).

allocateはインスタンスを生成するクラスの特異メソッドらしく,生成されたメソッドは特徴を持たない = 初期状態?であるべきのようだ.