BOOST模板库实现的功能与lua在语言层级提供的支持之比较

来源:互联网 发布:蓝月传奇翅膀升阶数据 编辑:程序博客网 时间:2024/05/06 01:37

因为编译器不能升级,所以用了不少boost,与语言层级提供支持,模板库易用性还是大打折扣。比如boost中还算不很复杂的boost::tuple可以让函数返回多个值,同样,lua在语言层面也支持这个功能。std::pair也可包装2个值并返回,但2个以上就不行了。

用boost::tuple:

boost::tuple<int,int> getTwoValue(int a,int b){    return boost::make_tuple (a * 10, b * 20);}int _tmain(int argc, _TCHAR* argv[]){    int a, b;    boost::tie (a, b) = getTwoValue (2, 3);    std::cout << a << " / " << b << std::endl;    return 0;}

这个是lua版本的,精炼的不可以思议,下面是一段完整的代码,变量无需事先声明:

function gettwoValue(x,y) return x*10,y*20 enda,b = gettwoValue(2,3);print(a .. " / " .. b)


使用模板你就得记住模板的名字:boost::tuple,还要记住一些辅助函数boost::make_tuple,boost::tie。而lua啥都不用记,直接就这么用了。

用std::pair的版本,记得模板得设成std::pair<int&,int&>引用的方式(又是一个坑)。总之,用C++的template这种看起来很酷用起来很多坑。


语言的发展,最终应该留下来的,就是像lua这种的,没有一个一个的坑,不用让人时刻保持警惕。又简单,无需大量的记忆。仅仅是一些语法的灵活的使用就能达到神奇的效果。


再看变长参数函数方面,C\C++比较丑陋,C++11在这方面有改进,旧的方式:

template<typename T>T GetMax(int nums,...){    va_list arg_ptr;    va_start (arg_ptr, nums);    T rst = va_arg (arg_ptr, T);    for (int i = 0; i != nums - 1; ++i)    {        rst = std::max (rst, va_arg (arg_ptr, T));    }    va_end (arg_ptr);    return rst;}

Lua的的变长参数:

function GetMax(...)  local t = {...}  local b = t[1]  for key,value in ipairs(t) do    b = (b > value) and b or value  end  return b;endprint(GetMax(1,6,41,5,11,2,20))print(GetMax(1,155.001,77.11))


不仅数目同样没有限制,类型也没有限制。C++ 11在这方面有改进,依然没有Lua清晰便捷。

Lua是用C写的,某种程度上Lua是C语言的一个抽象层,业务面窄了,却更专业了



0 0