【问题标题】:luabind - variable number of parametersluabind - 可变数量的参数
【发布时间】:2011-05-27 19:00:51
【问题描述】:

如何使用 luabind 绑定接受可变数量参数的函数? 基本上,我想编写自己的 print() 函数。

我知道luabind中的object类作为参数可以接受任何数据类型,最好是接收luabind::object的动态表作为参数。

【问题讨论】:

    标签: parameters lua luabind


    【解决方案1】:

    我在纯 lua C API 和 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;
    }
    

    【讨论】:

      【解决方案2】:

      看起来像 luabind doesn't support that。然而,考虑到它是一个全局函数而不是某个类的方法,你就不能使用常规的 C API 吗?它非常易于使用。例如,这是一个返回其参数类型的可变参数函数:

      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);
      

      【讨论】:

      • 是的,它比 luabind 本身更容易:)
      • 谢谢,但是为什么要返回 argc 呢?
      • 这就是我们告诉 API 我们有多少返回值(对应于我们刚刚压入堆栈的项目数量,使用lua_pushstring)。
      【解决方案3】:

      最好使用 string.format 并将剩余的字符串传递给日志函数。

      function printf(...)
          log(string.format(...))
      end
      

      这是我倾向于做的事情,然后我的应用程序可以决定将日志输出发送到文件或控制台。

      【讨论】:

        猜你喜欢
        • 2017-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-16
        • 1970-01-01
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多