有没有方法判断模板函数里参数的类型?
template <class T>
void f( T message )
{
...
//在这里能不能判断出传入的参数是什么类型?
}
谢谢!
问题点数:20、回复次数:6Top
1 楼rtdb(东临碣石)回复于 2002-11-22 16:26:04 得分 1
一般来说用模板就是为了不进行类型判别.
运行时类型判断用RTTI.
Top
2 楼middle(中间件)回复于 2002-11-22 16:29:15 得分 1
可以用overload来判断。Top
3 楼Dynamic(1.0)回复于 2002-11-22 17:19:09 得分 1
template <class T,class T1>
...
template <class T,int>
...
重载!Top
4 楼TopCat(令狐虫)回复于 2002-11-22 17:23:23 得分 2
楼上的方法对,不过这不叫“重载”,应该叫“模板特化”和“模板偏特化”
:)Top
5 楼HeavenS(King Of Terran)回复于 2002-11-23 14:52:48 得分 0
能不能判断基础类型如int, char, char*, double?Top
6 楼ThinkX(秋天的树)回复于 2002-12-06 00:31:19 得分 15
用type_traits也许可以,
我想可以这样用,写个简单的判断是否是bool型的。
template <typename T>
struct is_bool
{
enum {value = false;};
};
//这个是全特化的版本,好像VC7只支持全特化,不支持偏特化,
//bcb6是支持偏特化的,但是不算太完全,GCC对偏特化的支持应该更好。
template <>
struct is_bool<bool>
{
emum {value = true;};
};
if (is_bool<T>::value)
do..
在boost中有很多的type_traits可以用,可以判断T是不是指针类型等等。
如果你要对各个类型采取不同的操作,可以用下面的办法:
template <typename T>
struct Works
{
void Do() { //默认情况 }
};
template <>
struct Works<int>
{
void Do() { //int类型情况 }
};
template <>
struct Works<char>
{
void Do() { //char类型情况 }
};
...
template <class T>
void f( T message )
{
Works<T> t;
t.Do(); //会根据情况调用各自的代码
}Top




