c++ - Lua C++ 用户数据矩阵访问元素

标签 c++ lua lua-api meta-method

我在C++中有一个矩阵类,构造函数如下:

template <typename T> CMatrix<T>::CMatrix(unsigned int varrow,unsigned int varcolumn)
{
        //Lets set member variables
        this->m_row=varrow;this->m_column=varcolumn;

        //Create a place holder at heap
        m_matrix=new T[varrow*varcolumn];
        //
        unsigned int i=0;
        //
        //Default matrix All elements are zero

            for(i=0;i<varrow*varcolumn;i++)
            {
                    m_matrix[i]=T();
            }

        //
    }

我实现了如下设置和获取方法:

void SetCellValue(unsigned int row,unsigned int col,T value){ m_matrix[row*m_column+col]=value;}
T& GetCellValue(unsigned int row,unsigned int column) const{return m_matrix[row*m_column+column];}

矩阵类可以从 Lua 访问;但是,我可以从 Lua 访问矩阵元素的唯一方法是,如果 m 是矩阵,m:GetValue 或 m:SetValue。

我想知道是否可以通过符号 m[1,2] 或 m(1,2) 访问(设置)矩阵元素,其中 m 是矩阵,[1,2] 是元素第一行第二列。

最佳答案

有两个基本问题。 lua 语法和 lu​​a 语义。

语法

就语法而言,如果您使用用户数据的 __call 元方法,m(1,2) 绝对是可能的。

我不认为 m[1,2] 是可能的,我认为那不是有效的 lua。不过,如果您使用 __index 元方法,则可以使用 m[{1,2}]

语义

基本问题是 lua 与 javascript、java 和其他非 C++ 语言一样,使原始整数成为值类型而不是引用类型。

所以你可以轻松地让 m(1,2) 返回正确的整数,但是如果你想写 m(1,2) = 5,那就更难了,因为 m(1,2) 只返回一个拷贝,而不是一个引用。

在 Java 中,(饱受诟病的)解决方案是使用装箱,将基本类型包装在类中,以便为其提供正确的(引用)语义。这里的类比是您不返回 int,而是返回一个用户数据,该用户数据包装了对矩阵中 int 的引用。

在 lua 中,您通常通过使用 __index__newindex 元方法来避免这种情况。 __index 在您从用户数据请求子值时调用,而 __newindex 在您分配用户数据的子值时调用。所以不需要装箱,你可以给它所有你想要的语义。

问题是在这种情况下,__index__newindex 会给你丑陋的语法,你必须使用 m[{1,2} ]m[{1,2}] = 5 让它以这种方式工作。

选项

因此,选项 (1) 是为您拥有的任何类型实现某种装箱,并使用 __call 元方法。

选项 (2) 是,只需使用 __index__newindex 并习惯编写 m[{1,2}]

选项 (3) 是,尝试使用不同的语法 m[1][2]。然后你会想要创建一个新类来表示矩阵的一行,并通过 m[1] 将其暴露给 lua。然而,这也增加了一些复杂性,您出于各种原因不想这样做。 (并且您在评论中表示您真的不想这样做。)

如果他们扩展了 lua 语言,那么最好的事情就是 m[1,2] 只是 m[{1,2}] 的语法糖或者类似的东西。但是,我不会屏住呼吸。

如果是我,选项 (3) 是不可能的,我想我会选择选项 (2) 并习惯它。想看看是否有人知道对其进行改进。

关于c++ - Lua C++ 用户数据矩阵访问元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641487/

相关文章:

c - 使用lua的lightuserdata注册定时器回调

lua - dofile、loadfile和loadstring(文件:read()())?)有什么区别

c - Lua - 为什么 C 函数作为用户数据返回?

c++ - 避免复制粘贴代码初始化结构中的一系列 SDL_Rect

c++ - 程序编译失败

c++ - 在 C++ 中对指针 "sideways"进行类型转换时会发生什么

java - 应用程序内 Java 命令行

file - Lua 5.2中的沙箱

c++ - cpp 将对象存储在指针数组中

lua - 具有大循环的 Redis Lua 脚本