可変数のパラメーターを受け入れる関数をluabindにバインドするにはどうすればよいですか?基本的に、私は自分のprint()関数を書きたいと思っています。
パラメータとしてのluabindのクラスは、任意のデータ型を受け入れることができることを知っています。パラメータとしてのobject
動的テーブルを受け取るのが最善です。luabind::object
可変数のパラメーターを受け入れる関数をluabindにバインドするにはどうすればよいですか?基本的に、私は自分のprint()関数を書きたいと思っています。
パラメータとしてのluabindのクラスは、任意のデータ型を受け入れることができることを知っています。パラメータとしてのobject
動的テーブルを受け取るのが最善です。luabind::object
純粋なluaCAPIとluabindを組み合わせました。
int myPrint(lua_State* L)
{
int argCount = lua_gettop(L);
for(int i = 1; i <= argCount; i++)
{
luabind::object obj(luabind::from_stack(L, i));
switch(luabind::type(obj))
{
case LUA_TSTRING:
cout << luabind::object_cast<std::string>(obj);
break;
case LUA_TNUMBER:
cout << luabind::object_cast<double>(obj);
break;
case LUA_TBOOLEAN:
cout << boolalpha << luabind::object_cast<bool>(obj);
break;
case LUA_TNIL:
cout << "#Nil#";
break;
default:
cout << "#Unknown type '" << luabind::type(obj) << "'#";
break;
}
}
cout << endl;
return 0;
}
luabindはそれをサポートしていないようです。ただし、一部のクラスのメソッドではなくグローバル関数であることを考えると、通常のCAPIを使用することはできませんか?とても使いやすいです。たとえば、引数の型を返すvararg関数は次のとおりです。
static int types (lua_State* L) {
int argc = lua_gettop(L);
for (int i=1; i <= argc; ++i) {
lua_pushstring(L, lua_typename(L, lua_type(L, i)));
}
return argc;
}
...
lua_register(L, "types", types);
string.formatを使用し、残りの文字列をログ関数に渡す方がよいでしょう。
function printf(...)
log(string.format(...))
end
これは私がよく行うことであり、アプリケーションはログ出力をファイルまたはコンソールに送信することを決定できます。