在使用模版进行编程的时候,我们经常遇到需要判断数据类型、继而对数据类型进行特殊处理的问题。如何让编译器知道我们的我们传入的参数是什么样的数据类型类型呢?
比如:看下面的代码。怎么判断传入的参数是整形还是浮点型?
template<typename TYPE>
void typeCheck(TYPE data)
{
//do something check data type
}
复制
如果要回答上面的问题,就需要使用C++11的特性。使用is_same方法,这里需要引入type_traits头文件,在type_traits头文件中定义了很多类型检查的方法。
std::is_same 判断类型是否一致
这个方法使用方式相对简单,具体事例如下:
bool isInt = std::is_same<int, int>::value; //为true
复制
如果isInt值为true,则说明传入的参数类型是整形。反之则不是,同理,也可以根据此方法判断参数类型是都是浮点型、指针类型等。
为了说明这个方法的用法。下面来看一下官方的举例。官方主要实现了判断const int、int以及结构体类型的判断。
// is_same example
typedef int integer_type;
struct A { int x,y; };
struct B { int x,y; };
typedef A C;
int main() {
std::cout << std::boolalpha;
std::cout << "is_same:" << std::endl;
std::cout << "int, const int: ";
std::cout << std::is_same<int, const int>::value << std::endl;
std::cout << "int, integer_type: ";
std::cout << std::is_same<int, integer_type>::value << std::endl;
std::cout << "A, B: " ;
std::cout << std::is_same<A,B>::value << std::endl;
std::cout << "A, C: " ;
std::cout << std::is_same<A,C>::value << std::endl;
std::cout << "signed char, std::int8_t: ";
std::cout <<std::is_same<signed char,std::int8_t>::value<<std::endl;
return 0;
}
复制
运行结果:
看完了官方案例。不知道大家对于开头提出的问题是否已经有了方案。这里也给出大家解决方法,如下:
template<typename TYPE>
void typeCheck(TYPE data)
{
//do something check data type
if(std::is_same<TYPE,int>::value)
{
std::cout<<"TYPE data is int"<<std::endl;
}
else if
{
//other type
}
else
{
//default
}
}
复制
文章转载自CPP开发前沿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。