typeid是C++的一个运算符
typeid(int).name() 输出const char*的类型名字,需要支持RTTI
char b[5]={'a', 'b', 'c', 'd', 'e'};
int sum1=Total<int>(b, b+4);
template<typename R, typename T>
R Total(const T* beg, const T* end)
{
cout<<typeid(R).name()<<endl; ///int
cout<<typeid(T).name()<<endl; //char
R total=R(); //int()==0
while(beg!=end)
{
total+=*beg;
beg++;
}
total+=*beg;
return total;
}
//把复杂性放在实现里面,而提供一个稍微简单一点的调用方式,似乎是很多程序员孜孜不倦的追求。
template<typename T>
class TotalTrait
{
public:
typedef T R;
};
template<>
class TotalTrait<char>
{
public:
typedef int R;
};
template<typename T>
typename TotalTrait<T>::R Total(const T* beg, const T* end)
{
//tpyename是必要的修饰符,据说是编译器不能区分类型和静态变量引起的,其实编译器可以
//遍历以上申明,如果没有定义静态变量,就直接认为是类型就可以了,只要定义一个优先级
//就可以解决这个问题,反正编译器帮我们做的已经够多了,还差这一点吗?damn
cout<<typeid(TotalTrait<T>::R).name()<<endl;
cout<<typeid(T).name()<<endl;
TotalTrait<T>::R total=TotalTrait<T>::R();
while(beg!=end)
{
total+=*beg;
beg++;
}
total+=*beg;
return total;
}
//通过类型的萃取,可以让我们在调用的时候,少些一个<int>
char b[5]={'a', 'b', 'c', 'd', 'e'};
int sum1=Total(b, b+4);