現在、C++ オブジェクトをインスタンス化し、Lua で SWIG バインディングを使用して渡す方法を知っています。必要なのはその逆です。
Lua & C++ & SWIG を使用しています。
私は C++ のインターフェースと lua のオブジェクトを持っています。これらは同じ仕事をし、同じ構造を持つメソッドを実装しています。これらのオブジェクトを lua でインスタンス化できるようにしたいのですが、似ているインターフェイスへのポインターを使用して C++ で渡すことができます。
そのため、上記の lua オブジェクトのハンドラーとして機能するインターフェイスの C++ 実装を作成することは想像できますが、これを行う方法はわかりません。このクラスは、C++ の世界で lua オブジェクトの代表またはプロキシとして機能します。
明確にするために、私が尋ねた同様の質問への回答で使用されている次のコード例から始めます。
C++ コード:
// Represents a generic bank account
class Account {
virtual void deposit(double amount) = 0;
};
ルアコード:
SavingsAccount = { balance = 0 }
SavingsAccount.deposit = function(amount)
SavingsAccount.balance = SavingsAccount.balance + amount
end
-- Usage
a = SavingsAccount
a.balance = 100
a.deposit(1000)
ここで、Bank という C++ のクラスがあるとします。
class Bank {
void AddAccount(Account* a);
};
ここで欲しいのは、lua で次のことを行うためのメカニズムです。
SavingsAccount = { balance = 0 }
SavingsAccount.deposit = function(amount)
SavingsAccount.balance = SavingsAccount.balance + amount
end
-- Usage
a = SavingsAccount
bank:AddAccount(a)
プロキシとして機能する C++ クラスをインスタンス化し、すべての lua 関数を含む lua テーブルに渡すなど、追加の手順を実行する必要がある場合は、次のようになると想像できます。
C++ コード:
// Represents a generic bank account
class ProxyAccount : public Account {
virtual void deposit(double amount);
};
ルアコード:
SavingsAccount = { balance = 0 }
SavingsAccount.deposit = function(amount)
SavingsAccount.balance = SavingsAccount.balance + amount
end
-- Usage
a = SavingsAccount
a.balance = 100
a.deposit(1000)
proxy = program.ProxyAccount()
proxy.settable(a)
bank:AddAccount(p)
ここでの問題は、ProxyAccount クラスをどのように実装するか、または settable の関数シグネチャがどのように見えるかさえわからないことです...