今天看 TC++PL,有一道习题
What is the longest local name you can use in a C++ program on your system?
习惯性的认为,这道题应该去查我的编译器的手册,不过google了一下,发现有下面这种解法,利用C++ 模板元编
程,很有意思。
代码如下
template<typename T, typename U> struct Doublify {};
template<int N> class Exponential
{
public:
typedef Doublify<typename Exponential<N-1>::LongType,
typename Exponential<N-1>::LongType>
LongType;
};
template<> class Exponential<0>
{
public:
typedef double LongType ;
};
int f(Exponential<10>::LongType*)
{
return 3;
}
上述代码想法很简单,首先看看Exponential<10>::LongType发生了什么事情,其实就是在编译期间进行了递归
,触发了Exponential<10>,Exponential<9>,Exponential<8>,...Exponential<0>,而Exponential<0>这个模板特
化就是double,所以我们可以从Exponential<0>看,这段代码编译成了什么
Exponential<0>::LongType double
Exponential<1>::LongType Doublify<double,double>
Exponential<2>::LongType Doublify<Doubleify<double,double>,
Doubleify<double,double> >
Exponential<3>::LongType Doublify<Doubleify<Doubleify<double,double>,
Doubleify<double,double> >,
Doubleify<double,double>,
Doubleify<double,double> >
如上,看到了吧,模板生成的名字会以N的指数增长,所以可以方便的测试出系统支持的最长名字。
感叹阿,聪明人真的多阿。
What is the longest local name you can use in a C++ program on your system?
习惯性的认为,这道题应该去查我的编译器的手册,不过google了一下,发现有下面这种解法,利用C++ 模板元编
程,很有意思。
代码如下
template<typename T, typename U> struct Doublify {};
template<int N> class Exponential
{
public:
typedef Doublify<typename Exponential<N-1>::LongType,
typename Exponential<N-1>::LongType>
LongType;
};
template<> class Exponential<0>
{
public:
typedef double LongType ;
};
int f(Exponential<10>::LongType*)
{
return 3;
}
上述代码想法很简单,首先看看Exponential<10>::LongType发生了什么事情,其实就是在编译期间进行了递归
,触发了Exponential<10>,Exponential<9>,Exponential<8>,...Exponential<0>,而Exponential<0>这个模板特
化就是double,所以我们可以从Exponential<0>看,这段代码编译成了什么
Exponential<0>::LongType double
Exponential<1>::LongType Doublify<double,double>
Exponential<2>::LongType Doublify<Doubleify<double,double>,
Doubleify<double,double> >
Exponential<3>::LongType Doublify<Doubleify<Doubleify<double,double>,
Doubleify<double,double> >,
Doubleify<double,double>,
Doubleify<double,double> >
如上,看到了吧,模板生成的名字会以N的指数增长,所以可以方便的测试出系统支持的最长名字。
感叹阿,聪明人真的多阿。