[#46647] RubyでWindowsの常駐サービスプログラムを作る方法 — kouichi_someya@...

はじめまして。

12 messages 2009/12/16
[#46649] Re: RubyでWindowsの常駐サービスプログラムを作る方法 — "U.Nakamura" <usa@...> 2009/12/17

こんにちは、なかむら(う)です。

[ruby-list:46713] 拡張ライブラリで引数の数が違うオーバーロード関数の定義の仕方に関する質問

From: ueda <tueda@...>
Date: 2009-12-28 03:15:21 UTC
List: ruby-list #46713
こんにちは。

今C++でRubyの拡張ライブラリを書いています。
C++でオーバーロードされたメンバー関数(関数名が同じで引数の数と型が違う)を
Rubyから使うための rb_define_method の書き方を教えてください。

例えばC++でLoaderクラスに2種類のload関数があります。

C++のソース:

class Loader
{
public:
static void load (void* data, int offset);
static void load (const char* name);
}

関数のラッパー:

// 2つめの引数の指定がない場合はnilのつもり
VALUE binder_Loader_load (VALUE self, VALUE val_data, VALUE offset=Qnil)
{
// ここで引数の型を Kernel#type を使ってチェックして分岐する。
return Qnil;
}

登録:

void Init_m3g
{
rb_define_singleton_method (rb_cLoader, "load",
(VALUE(*)(...))binder_Loader_load, 2);
}

で、これをRubyから呼び出すと引数が2つある方は呼べるのですが、1つの方が呼
べません。

テスト:

def test_loade_from_file
M3G::Loader.load "file-name"
end

実行結果:

1) Error:
test_loade_from_file(TC_Loader):
ArgumentError: wrong number of arguments (1 for 2)
./test-Loader.rb:12:in `load'
./test-Loader.rb:12:in `test_load_from_file'


質問ですがこういう引数の個数が違うオーバーロード関数の拡張ライブラリの書
き方を教えていただけないでしょうか。
C++の方を名前を変えて2つの別の関数にするのは(規格で決まっているので)で
きません。


In This Thread

Prev Next