首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C++对象传递给ChaiScript函数

将C++对象传递给ChaiScript函数
EN

Stack Overflow用户
提问于 2019-10-09 18:18:31
回答 1查看 789关注 0票数 1

我试图将一个定制的c++对象引用传递给一个简单的chai脚本,这样chai脚本最终可以读取/访问/调用公共变量和方法。

我不确定这是否可能,也不确定它是否在chai脚本函数中传递,如果它能够访问类值,而不需要在chai中定义类.任何洞察力都会很有帮助,因为我找不到与此相关的文档中的特定部分。

这里是一个非常基本的实现。

ChaiScript.h

代码语言:javascript
复制
#pragma once

#include "ChaiScript\include\chaiscript\chaiscript.hpp"

class ChaiScript
{
public:
   explicit ChaiScript(
      const std::string& script_name);

   ~ChaiScript();

   chaiscript::ChaiScript chai;

private:
};

ChaiScript.cpp

代码语言:javascript
复制
#include "ChaiScript.h"

ChaiScript::ChaiScript(
   const std::string& script_name)
{
   chai.add(chaiscript::vector_conversion<std::vector<int>>());

   chai.eval_file(script_name);
}

ChaiScript::~ChaiScript()
{

}

SampleClass.h

代码语言:javascript
复制
#pragma once
#include <string>

class SampleClass
{
public:
   SampleClass(
      const int id,
      const int x,
      const int y,
      const std::string& name);

   const int m_id;
   int m_x;
   int m_y;
   std::string m_name;

private:

   // Disable copying as we don't want to make a copy each time we pass the class to chai...
   SampleClass();
   SampleClass(const SampleClass& rhs);
   SampleClass& operator=(const SampleClass& rhs);
};

SampleClass.cpp

代码语言:javascript
复制
#include "SampleClass.h"

SampleClass::SampleClass(
   const int id,
   const int x,
   const int y,
   const std::string& name) : 
   m_id(id),
   m_x(x),
   m_y(y),
   m_name(name)
{

}

main.cpp

代码语言:javascript
复制
#include "ChaiScript.h"
#include "SampleClass.h"

int main()
{
   SampleClass* sample_class = new SampleClass(0, 1, 2, "Test");
   ChaiScript* script = new ChaiScript("Scripts\\SampleScript.chai");

   // This line is where I start to need help as it does not compile.
   script->chai.eval<std::function<void(&SampleClass)>>("ReceiveSampleClass")(&sample_class);

   system("pause");
   return 0;
}

SampleScript.chai

代码语言:javascript
复制
def ReceiveSampleClass(SampleClass sample)
{
    var result = sample.m_x + sample.m_y;
    print("2+2=" + to_string(result));
}
EN

回答 1

Stack Overflow用户

发布于 2019-10-09 19:02:35

经过更多的搜索,我找到了如何做到这一点!

我已经将ChaiScript.cpp更改为:

代码语言:javascript
复制
#include "ChaiScript.h"
#include "SampleClass.h"

ChaiScript::ChaiScript(
   const std::string& script_name)
{
   chai.add(chaiscript::vector_conversion<std::vector<int>>());

   chaiscript::ModulePtr m = chaiscript::ModulePtr(new chaiscript::Module());

   chaiscript::utility::add_class<SampleClass>(*m,
      "SampleClass",
      { 
         chaiscript::constructor<SampleClass(const int id, const int x, const int y, const std::string & name)>() 
      },
      { 
         {chaiscript::fun(&SampleClass::m_x), "X"} 
      });

   chai.add(m);

   chai.eval_file(script_name);
}

ChaiScript::~ChaiScript()
{

}

我的SampleScript.chai也更改为:

代码语言:javascript
复制
def ReceiveSampleClass(SampleClass sample)
{
    var result = sample.X;
    sample.X += 2;
    var result2 = sample.X;
    print("1) " + to_string(result));
    print("2) " + to_string(result2));
}

我遗漏的过程是将类添加到模块中,并将其添加到chai脚本中。

代码语言:javascript
复制
   chaiscript::ModulePtr m = chaiscript::ModulePtr(new chaiscript::Module());

   chaiscript::utility::add_class<SampleClass>(*m,
      "SampleClass",
      { 
         chaiscript::constructor<SampleClass(const int id, const int x, const int y, const std::string & name)>() 
      },
      { 
         {chaiscript::fun(&SampleClass::m_x), "X"} 
      });

   chai.add(m);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58310058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档