17
回答
C++元编程
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

最近在网上找有关模板的找到一篇关于模板使用的元编程的概念,如果在某些中采用这种方法,在编译时就把数据值算出来而不是在程序执行是才运行,是不是可以减少一定运算时间,贴段代码:

#include <iostream>

using namespace std;

template<class T1, class T2>
class MyClass
{
     public:
           enum e { data = T1*MyClass<T1, T2-1>::data};
};

template<class T1>
class MyClass<T1, 0>
{
     public:
           enum e { data = 1};
};

int main()
{
     MyClass<3, 4> c;     // 求解3 的4次方
     cout<<c.data<<endl;
     return 0;
}    
举报
afsdasdf
发帖于6年前 17回/729阅
共有17个评论 最后回答: 6年前
酷壳以前有篇博文介绍过这样的方法( http://coolshell.cn/articles/3738.html#more-3738)。不过,这种方法看起来很酷,但是很难找到实际的作用。能编译时候算出来的东西,你都可以先算出来,以查询表或其它形式存起来,用到时候直接索引。这样做,在我所能想到的任何意义上,都比编译时运算的方法好。
用它来进行某些类型识别,然后执行一些动态语言类型的运算还是比较有用的,但是代码难读啊
Sorry, 我这是在网页上现写的,应该将class改为int.
#include <iostream>

using namespace std;

template<int T1, int T2>
class MyClass
{
     public:
           enum e { data = T1*MyClass<T1, T2-1>::data};
};

template<int T1>
class MyClass<T1, 0>
{
     public:
           enum e { data = 1};
};

int main()
{
     MyClass<3, 4> c;     // 求解3 的4次方
     cout<<c.data<<endl;
     return 0;
}    

元编程可不只是编译时计算这么简单哦。。。这玩意用处可大了。。详细请阅读STL, BOOST源码,看得你内牛满面

#include <iostream>

template < bool b, typename T1, typename T2 >
struct _type_helper
{
    typedef T2 type;
};
template < typename T1, typename T2 >
struct _type_helper< true, T1, T2 >
{
    typedef T1 type;
};

template < typename T1, typename T2 >
struct large_type
{
    typedef typename _type_helper< ( sizeof(T1) > sizeof(T2) ), T1, T2 >::type type;
};
template < typename T1, typename T2 >
struct small_type
{
    typedef typename _type_helper< ( sizeof(T2) > sizeof(T1) ), T1, T2 >::type type;
};

template < typename T1, typename T2 >
typename small_type<T1,T2>::type auto_min( T1 a, T2 b )
{
    return (a < b ? a : b);
}

template < typename T1, typename T2 >
typename large_type<T1,T2>::type auto_max( T1 a, T2 b )
{
    return a > b ? a : b;
}

int main()
{
    std::cout << auto_max( 'A', 66 ) << std::endl;
    std::cout << auto_min( 'A', 66 ) << std::endl;
    return 0;
}

附一份高级点的元编程代码,有简单的类型演算。

输出
66
A

顶部