2017-04-17 24 views
0

我有一個定義類:如何用ChaiScript中的用戶類型的std :: initializer_list調用構造函數?

class MyType { 
public: 
    MyType(); 
    MyType(int x); 
    MyType(std::initializer_list<MyType> list); 
} 

註冊我的自定義類及其ChaiScript V6.0.0構造函數如下:

chai.add(chaiscript::user_type<MyType>(), "MyType"); 
chai.add(chaiscript::constructor<MyType()>(), "MyType"); 
chai.add(chaiscript::constructor<MyType(int)>(), "MyType"); 
chai.add(chaiscript::constructor<MyType(std::initializer_list<MyType>)>(), "MyType"); 

我的下一個腳本:

std::string script1 = R""(
    def Test1() { 
     var m = MyType(); 
    } 

    Test1(); 
)""; 
auto res = chai.eval<MyType>(script1); 


std::string script2 = R""(
    def Test2() { 
     var m = MyType(10); 
    } 

    Test2(); 
)""; 
auto res2 = chai.eval<MyType>(script2); 


std::string script3 = R""(
    def Test3() { 
     var m = MyType({10, 20}); 
    } 

    Test3(); 
)""; 
auto res3 = chai.eval<MyType>(script3); 

script1script2運行沒有問題,但script3給我下一個執行錯誤:

Error: "Incomplete equation" during evaluation at (9, 14) 

從ChaiScript調用構造函數MyType(std::initializer_list<MyType>)的正確方法是什麼?

+0

注意:正確的'std :: in itializer_list <>'構造函數看起來像這樣:'MyType(std :: initializer_list list);'See:http://en.cppreference.com/w/cpp/utility/initializer_list另見:http:// stackoverflow。 com/a/17803511/2296177 – user2296177

+0

@ user2296177感謝格式建議。 – chema989

+0

@ chema989:ChaiScript是否有辦法註冊一個可變參數函數?如果沒有,我看不到ChaiScript能夠做到這一點的方法。所有'initializer_list'實例最終都來自braced-init-list。哪一個是C++語法結構; ChaiScript不能製造這樣的東西。 –

回答

1

ChaiScript沒有註冊可變參數函數的方法,它需要爲每個可能的參數組合註冊一個函數,並且不能像C++那樣製作braced-init-list。

,我發現是添加一個構造MyType接收向量解決方法:

class MyType { 
public: 
    MyType(); 
    MyType(int x); 
    MyType(std::initializer_list<MyType> list); 
    MyType(const std::vector<MyType>& v); 
} 

註冊我的自定義類及其ChaiScript V6.0.0構造函數如下:

chai.add(chaiscript::user_type<MyType>(), "MyType"); 
chai.add(chaiscript::constructor<MyType()>(), "MyType"); 
chai.add(chaiscript::constructor<MyType(int)>(), "MyType"); 
chai.add(chaiscript::constructor<MyType(const std::vector<MyType>&)>(), "MyType"); 

並將script3更改爲:

std::string script3 = R""(
    def Test3() { 
     var m = MyType([MyType(10), MyType(20)]); 
    } 

    Test3(); 
)""; 
相關問題