青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 5, 文章 - 0, 評(píng)論 - 13, 引用 - 0
數(shù)據(jù)加載中……

luabind的converter和policy

      現(xiàn)在的C++設(shè)計(jì),為了保證健壯性和復(fù)用性,特別是GP的流行,往往應(yīng)用了大量的模板,容器,智能指針。但這對(duì)與LUA綁定來(lái)說(shuō)絕對(duì)不是一個(gè)好消息,非常的煩瑣。個(gè)人覺(jué)得,在第三方的綁定庫(kù)里面,luabind和現(xiàn)代C++設(shè)計(jì)結(jié)合最好,也是靈活性最高的一個(gè)綁定庫(kù)。
      luabind確實(shí)很強(qiáng)大,但這里就不介紹一般應(yīng)用了,doc中有詳細(xì)的說(shuō)明,使用也非常的簡(jiǎn)單。我主要介紹一下converter和policy,特別是policy,簡(jiǎn)直是luabind中的核武器,可以非常方便的讓容器,迭代子與lua相結(jié)合。但遺憾的是,luabind的文檔中并沒(méi)有對(duì)自定義convert和policy做一個(gè)詳細(xì)說(shuō)明,那個(gè)converter的說(shuō)明,牛頭不對(duì)馬嘴,sample中的any converter,更是無(wú)法編譯。
      我這里通過(guò)容器vector的應(yīng)用來(lái)說(shuō)明,怎么自定義convert和policy。
      首先,我們來(lái)看這么一段代碼:
void test1(const vector<string> &v) 

    copy(v.begin(),v.end(),ostream_iterator
<string>(cout,"\n"));
}
 

vector
<string> test2() 

    vector
<string> r; 

    r.push_back(
"r");
    r.push_back(
"g");
    r.push_back(
"b");

    
return r; 
}
 

void main(){

    lua_State
* L = lua_open();
    luaL_openlibs(L);

    open(L);

    module(L) 
        [ 
            def(
"test1"&test1), 
            def(
"test2"&test2)
        ]; 

    luaL_dostring(L,
"test1({\"1\",\"2\",\"3\"}) vec=test2() for k, v in ipairs(vec) do print(k..\":\"..v) end");
    lua_close(L);
}

           毫無(wú)疑問(wèn),調(diào)用這段lua代碼,得不到任何正確的結(jié)果,甚至當(dāng)你把vector<string>當(dāng)參數(shù)傳給lua,會(huì)得到y(tǒng)ou are trying to use an unregistered type的一個(gè)assert。因?yàn)閘uabind并不知道怎樣去處理vector<string>這個(gè)東西。
   最簡(jiǎn)單的做法,我們就是通過(guò)default_converter的特化,來(lái)實(shí)現(xiàn)容器的使用。luabind都是通過(guò)default_converter來(lái)把call_function的調(diào)用參數(shù)壓入lua調(diào)用棧,所有的default_converter特化都可以在policy.hpp中找到。比如,將std::string入棧的特化convert就是:
      
template <>
struct default_converter<std::string>
  : native_converter_base
<std::string>
{
    
static int compute_score(lua_State* L, int index)
    
{
        
return lua_type(L, index) == LUA_TSTRING ? 0 : -1;
    }


    std::
string from(lua_State* L, int index)
    
{
        
return std::string(lua_tostring(L, index), lua_strlen(L, index));
    }


    
void to(lua_State* L, std::string const& value)
    
{
        lua_pushlstring(L, value.data(), value.size());
    }

}
;

   其中void to(lua_State* L, std::string const& value),是把string壓入棧中。而from是將一個(gè)棧中數(shù)據(jù)轉(zhuǎn)化為string,computer_score檢查棧中數(shù)據(jù)類型是否符合。很簡(jiǎn)單,不是嗎?那讓我們來(lái)看看,我們的vector應(yīng)該怎么寫(xiě)。
   

namespace luabind
{
    template 
<class T>
    
struct default_converter<vector<T> >
        : native_converter_base
<vector<T> >
    
{
        
static int compute_score(lua_State* L, int index)
        
{
            
return (lua_type(L, index) == LUA_TTABLE )? 0 : -1;
        }


        vector
<T>  from(lua_State* L, int index)
        
{
            vector
<T> container; 
            luabind::
object tbl(from_stack(L, index)); 
            
            
for (luabind::iterator itr(tbl), end; itr != end; ++itr) 
            

                boost::optional
<T> v = object_cast_nothrow<T>(*itr); 
                
if (v)
                    container.push_back(
*v); 
                }
 
            }
 

            
return container; 
        }


        
void to(lua_State* L, vector<T>  const& container)
        
{
            lua_createtable(L, container.size(), 
0); 

            luabind::
object tbl(from_stack(L, -1)); 
            
int n = 0

            
for (vector<T>::const_iterator itr = container.begin(); itr != container.end(); ++itr) 
            

                tbl[
++n] = *itr; 
            }

        }

    }
;

    template 
<class T>
    
struct default_converter<vector<T>  const&>
        : default_converter
<vector<T> >
    
{};
}

 

     是不是很簡(jiǎn)單啊。:) 再運(yùn)行上面那段代碼。。就得到了我們想要的正確結(jié)果:
   
   
      至于luabind的policy,它就更強(qiáng)大了。我們來(lái)看看policy版本的容器,應(yīng)該怎么來(lái)做。luabind/contain_policy.hpp就實(shí)現(xiàn)了容器的使用。代碼如下

// Copyright (c) 2003 Daniel Wallin and Arvid Norberg

// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
// ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
// OR OTHER DEALINGS IN THE SOFTWARE.


#ifndef LUABIND_CONTAINER_POLICY_HPP_INCLUDED
#define LUABIND_CONTAINER_POLICY_HPP_INCLUDED

#include 
<luabind/config.hpp>
#include 
<luabind/detail/policy.hpp>
#include 
<boost/mpl/apply_wrap.hpp>

namespace luabind namespace detail {

    
namespace mpl = boost::mpl;

    template
<class Policies>
    
struct container_converter_lua_to_cpp
    
{
        template
<class T>
        T apply(lua_State
* L, by_const_reference<T>int index)
        
{
            typedef typename T::value_type value_type;

            typedef typename find_conversion_policy
<1, Policies>::type converter_policy;
            typename mpl::apply_wrap2
<converter_policy,value_type,lua_to_cpp>::type converter;

            T container;

            lua_pushnil(L);
            
while (lua_next(L, index))
            
{
                container.push_back(converter.apply(L, LUABIND_DECORATE_TYPE(value_type), 
-1));
                lua_pop(L, 
1); // pop value
            }


            
return container;
        }


        template
<class T>
        T apply(lua_State
* L, by_value<T>int index)
        
{
            
return apply(L, by_const_reference<T>(), index);
        }


        template
<class T>
        
static int match(lua_State* L, by_const_reference<T>int index)
        
{
            
if (lua_istable(L, index)) return 0else return -1;
        }


        template
<class T>
        
void converter_postcall(lua_State*, T, int{}
    }
;

    template
<class Policies>
    
struct container_converter_cpp_to_lua
    
{
        template
<class T>
        
void apply(lua_State* L, const T& container)
        
{
            typedef typename T::value_type value_type;

            typedef typename find_conversion_policy
<1, Policies>::type converter_policy;
            typename mpl::apply_wrap2
<converter_policy,value_type,lua_to_cpp>::type converter;

            lua_newtable(L);

            
int index = 1;

            
for (typename T::const_iterator i = container.begin(); i != container.end(); ++i)
            
{
                converter.apply(L, 
*i);
                lua_rawseti(L, 
-2, index);
                
++index;
            }

        }

    }
;

    template
<int N, class Policies>
//    struct container_policy : converter_policy_tag
    struct container_policy : conversion_policy<N>
    
{
//        BOOST_STATIC_CONSTANT(int, index = N);

        
static void precall(lua_State*const index_map&{}
        
static void postcall(lua_State*const index_map&{}

        
struct only_accepts_nonconst_pointers {};

        template
<class T, class Direction>
        
struct apply
        
{
            typedef typename boost::mpl::if_
<boost::is_same<lua_to_cpp, Direction>
                , container_converter_lua_to_cpp
<Policies>
                , container_converter_cpp_to_lua
<Policies>
            
>::type type;
        }
;
    }
;

}
}


namespace luabind
{
    template
<int N>
    detail::policy_cons
<detail::container_policy<N, detail::null_type>, detail::null_type> 
    container(LUABIND_PLACEHOLDER_ARG(N)) 
    

        
return detail::policy_cons<detail::container_policy<N, detail::null_type>, detail::null_type>(); 
    }


    template
<int N, class Policies>
    detail::policy_cons
<detail::container_policy<N, Policies>, detail::null_type> 
    container(LUABIND_PLACEHOLDER_ARG(N), 
const Policies&
    

        
return detail::policy_cons<detail::container_policy<N, Policies>, detail::null_type>(); 
    }

}


#endif // LUABIND_CONTAINER_POLICY_HPP_INCLUDED

   看一下,眼熟嗎,感覺(jué)怎樣?不過(guò)是container_converter_lua_to_cpp對(duì)應(yīng)著default_converter::from而container_converter_cpp_to_lua對(duì)應(yīng)著default_converter::to。
      當(dāng)然,policy除了converter以為,還有關(guān)于對(duì)象生命周期的控制,具體的可以參加luabind目錄下的其他policy。


 

posted on 2009-01-08 17:10 clane 閱讀(2751) 評(píng)論(2)  編輯 收藏 引用 所屬分類: LUAC++

評(píng)論

# re: luabind的converter和policy  回復(fù)  更多評(píng)論   

高人!
2009-02-14 15:47 | 金慶

# re: luabind的converter和policy[未登錄](méi)  回復(fù)  更多評(píng)論   

那個(gè)any_converter稍作修改可以編譯過(guò),增加幾個(gè)details::就行了。
但是tmd:

1,運(yùn)行起來(lái)不work,說(shuō)Trying to use unregistered class
2,這東西到底怎么工作的?那個(gè)convert_cpp_to_lua沒(méi)任何地方有關(guān)系阿
2011-03-24 13:58 | alpha

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品免费看片| 欧美激情网友自拍| 国产精品一二三视频| 亚洲午夜国产成人av电影男同| 久久黄色影院| 老司机精品视频网站| 亚洲激情影视| 9人人澡人人爽人人精品| 欧美日韩精品系列| 欧美一级二级三级蜜桃| 亚洲国产女人aaa毛片在线| 国产在线视频不卡二| 欧美一级黄色网| 久久动漫亚洲| 亚洲精品在线观看免费| 99精品热视频| 国产字幕视频一区二区| 亚洲第一成人在线| 欧美视频亚洲视频| 鲁大师影院一区二区三区| 欧美美女日韩| 美女视频一区免费观看| 欧美人成在线视频| 久久免费少妇高潮久久精品99| 欧美福利一区二区| 欧美一区免费视频| 欧美精品一卡| 久久女同互慰一区二区三区| 欧美日韩另类在线| 老司机精品导航| 国产精品欧美日韩一区二区| 欧美高清日韩| 国产一区二区观看| 99精品视频免费观看视频| 在线播放日韩专区| 亚洲嫩草精品久久| 亚洲视频 欧洲视频| 久久久五月天| 久久成人羞羞网站| 欧美午夜精品理论片a级大开眼界| 麻豆成人精品| 国产亚洲一区精品| 亚洲欧美日韩天堂| 亚洲欧美日韩高清| 欧美区一区二| 亚洲国产精品va在看黑人| 国产一区二区三区直播精品电影 | 欧美a级在线| 国产欧美一区二区三区久久人妖| 亚洲精品久久久久久一区二区| 国产一区亚洲| 亚洲综合激情| 亚洲欧美日韩综合aⅴ视频| 欧美精品九九| 亚洲国产成人精品久久久国产成人一区| 国产日韩亚洲欧美精品| 亚洲一二三区视频在线观看| 一区二区三区国产在线观看| 麻豆国产精品va在线观看不卡| 男人的天堂亚洲在线| 国产一级揄自揄精品视频| 亚洲图片欧洲图片av| 亚洲一二三区在线| 国产精品成人一区二区三区夜夜夜 | 亚洲精品激情| 欧美成年人网站| 亚洲国产一区二区三区青草影视| 在线观看视频一区| 欧美mv日韩mv国产网站app| 老司机久久99久久精品播放免费 | 亚洲一区在线视频| 欧美成人免费网| 亚洲国产精品久久人人爱蜜臀 | 欧美h视频在线| 亚洲国产成人精品久久久国产成人一区| 欧美亚洲网站| 蜜臀av一级做a爰片久久| 伊人久久亚洲热| 欧美电影在线观看完整版| 亚洲国产日韩在线一区模特| 99视频在线观看一区三区| 欧美日韩少妇| 性欧美激情精品| 麻豆freexxxx性91精品| 亚洲美女电影在线| 国产精品久久久久久久久婷婷| 亚洲欧美日韩综合| 欧美暴力喷水在线| 夜色激情一区二区| 国产欧美精品日韩| 蜜臀a∨国产成人精品| 日韩一级在线| 久久久亚洲国产美女国产盗摄| 亚洲激情成人| 国产精品美女在线观看| 久久久在线视频| 日韩视频专区| 老鸭窝毛片一区二区三区| 一区二区三区四区精品| 国产午夜精品久久久| 欧美国产精品| 欧美在线视频播放| 亚洲乱码国产乱码精品精可以看 | 久久蜜臀精品av| 亚洲制服av| 91久久久精品| 国产一区二区三区自拍| 欧美日韩一区二区三区四区五区 | 久久免费99精品久久久久久| 一本久道久久久| 欧美国产亚洲视频| 久久xxxx| 亚洲欧美www| 日韩亚洲国产欧美| 伊人狠狠色丁香综合尤物| 国产精品狠色婷| 欧美成人精品在线视频| 欧美中文字幕视频在线观看| 艳女tv在线观看国产一区| 欧美大片免费观看在线观看网站推荐 | 国产精品免费福利| 欧美日韩成人在线播放| 久久这里只有| 久久免费99精品久久久久久| 欧美亚洲综合网| 亚洲午夜久久久| 99视频有精品| 日韩天堂在线观看| 91久久精品国产| 欧美大片91| 欧美成人国产va精品日本一级| 欧美影院成年免费版| 99视频有精品| 一区二区激情视频| 亚洲人永久免费| 91久久精品国产91久久| 亚洲第一页在线| 一区二区三区在线高清| 国产日韩欧美亚洲一区| 国产精品爽黄69| 国产精品毛片在线| 国产精品日韩欧美大师| 国产精品专区h在线观看| 国产精品国产三级国产普通话三级 | 亚洲国产日韩欧美| 亚洲黄网站在线观看| 99精品久久久| 在线一区二区日韩| 亚洲在线观看| 欧美一区二区三区电影在线观看| 欧美亚洲一区| 美女尤物久久精品| 欧美激情影院| 亚洲作爱视频| 欧美一级理论片| 免费在线看成人av| 欧美日韩精品一区二区三区四区| 欧美视频在线观看一区| 国产精品一区二区三区成人| 国产一区日韩二区欧美三区| 在线观看日韩一区| 中文日韩在线视频| 欧美中文字幕精品| 模特精品裸拍一区| 99re热这里只有精品免费视频| 亚洲一二三区精品| 久久综合色天天久久综合图片| 欧美精品亚洲精品| 国产伦精品一区二区三区免费迷| 激情丁香综合| 一区二区三区不卡视频在线观看| 香蕉尹人综合在线观看| 麻豆精品视频在线观看| 亚洲人成人一区二区在线观看| 在线视频欧美日韩精品| 久久久国产精品一区| 欧美日韩国产在线一区| 国产欧美亚洲视频| 亚洲人成绝费网站色www| 午夜精品理论片| 欧美成人综合网站| 午夜精品短视频| 欧美黄色网络| 激情懂色av一区av二区av| 亚洲亚洲精品在线观看 | 久久午夜羞羞影院免费观看| 亚洲精品女人| 亚洲欧美综合另类中字| 欧美区在线播放| 一色屋精品视频免费看| 亚洲欧美成aⅴ人在线观看| 亚洲国产精品一区| 欧美在线一二三| 欧美网站在线| 99成人在线| 欧美激情亚洲自拍| 久久精品首页| 国产日韩av高清| 亚洲一区二区三区欧美| 亚洲国产99|