问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C++判断,比较类型的几种方法

发布网友 发布时间:2022-04-25 12:40

我来回答

2个回答

热心网友 时间:2024-10-31 12:34

C++里有很多特性让我们可以判断一个变量或值是什么类型,比较两个类型是不是一样,或者比较两个变量是不是同一类型的。这对学习过程是很有用的。

  判断单个变量或值的类型
  由于数组和指针复杂性,很多初学者感到无所适从,面对一大堆的东西,不知道到底结果是什么。当然了,首先要知道它的类型。

  最简单、实用的方法:利用编译器。如果你故意将一个你不知道的东西,赋给一个毫不相干的变量,那么,编译器会绝对忠实地告诉你“XX类型不能转换成XXX类型”,这样,你就知道它的类型了。例如:

  int main ()
  int (*apa[10])[10];
  double tmp;
  tmp = apa[0];
  }
  

  这在Dev-C++4.9.8.0(GCC3.2)中,编译后会报错“cannot convert `int (*)[10]' to `double' in assignment”。这样,你就知道apa[0]的类型是int(*)[10]了^__^

  ............................................................

  第二种方法是利用重载。假设,你知道一个变量只能是某几种类型,那么可以把那几种情况都重载了,于是编译器会自动地选择合适的函数,这样也就区分开了,你就知道它是什么类型了。例如:

  #include <iostream>
  #include <cstdlib>
  using namespace std;

  void type (int) { cout << "int" << endl; }
  void type (int*) { cout << "int*" << endl; }

  int main ()
  {
  int a[10];
  type (a+1);

  system ("Pause");
  return 0;
  }
  

  结果会输出“int*”。这个办法很不错。但是如果发生“意外”,它是意料之外的类型,那么你就没有办法了,编译会出错。这时就可以用第一种方法来查看了。

  ............................................................

  第三种方法是用template(模板)来实现。首先定义一个模板函数,对所有类型都说是“未知”类型,然后,再一个一个特化出可能的类型。

  #include <iostream>
  #include <cstdlib>
  using namespace std;

  template <typename T>
  void type (T) {
  cout << "Unknown" << endl;
  }

  template <>
  void type <int> (int) {
  cout << "int" << endl;
  }

  template <>
  void type <int*> (int*) {
  cout << "int*" << endl;
  }

  int main ()
  {
  int a[10];
  type (*a+1);
  
  system ("Pause");
  return 0;
  }
  

  使用template的好处是,对于意料之外的类型,可以输出“Unknown”来表示,不会编译通不过。而且,使用template可以进一步使用更“华丽”的技巧。

  ............................................................

  另外一种方法是typeinfo,这个我还不太熟悉。只简略说一下吧。

  #include <iostream>
  #include <cstdlib>
  #include <typeinfo>
  using namespace std;

  int main ()
  {
  cout << "char:" << typeid(char).name() << endl;
  cout << "unsigned char:" << typeid(unsigned char).name() << endl;
  cout << "signed char:" << typeid(signed char).name() << endl;
  
  system ("Pause");
  return 0;
  }
  

  你能看到几个字符串,但是你不知道是什么意思。

  比较两种类型
  比较两种类型方法也不少,可以用template和typeinfo。

  用template的话,首先实现直接比较两种类型:

  template <typename T, typename U>
  struct SameType {
  static const bool isSame = false;
  };

  template <typename T>
  struct SameType<T, T> {
  static const bool isSame = true;
  };
  

  使用要用两种类型,象这样:

  int main ()
  {
  cout << "unsigned and unsigned int is: "
  << SameType <unsigned, unsigned int>::isSame << endl;
  cout << "long and int is: "
  << SameType <long, int>::isSame << endl;
  
  system ("Pause");
  return 0;
  }
  

  ............................................................

  第二种可以比较变量或值,用函数封装来实现:

  template <typename T, typename U>
  struct SameType {
  static const bool isSame = false;
  };

  template <typename T>
  struct SameType<T, T> {
  static const bool isSame = true;
  };

  template <typename T, typename U>
  bool isSameType (T, U) {
  return SameType <T, U>::isSame;
  }
  

  使用时可以用两个变量,象这样:

  int main ()
  {
  int a, b;
  long c;
  cout << "int a and int b:" << isSameType (a, b) << endl;
  cout << "long c and int a:" << isSameType (c, a) << endl;
  
  system ("Pause");
  return 0;
  }
  

  ............................................................

  用typeinfo实现:

  template <typename T, typename U>
  bool isSameType (T t, U u) {
  return typeid(t) == typeid(u);
  }
  

  使用时象这样:

  int main ()
  {
  int a, b;
  long c;
  cout << "int a and int b:" << isSameType (a, b) << endl;
  cout << "long c and int a:" << isSameType (c, a) << endl;
  
  system ("Pause");
  return 0;
  }

热心网友 时间:2024-10-31 12:27

比较类型?能说清楚点不?

热心网友 时间:2024-10-31 12:29

C++里有很多特性让我们可以判断一个变量或值是什么类型,比较两个类型是不是一样,或者比较两个变量是不是同一类型的。这对学习过程是很有用的。

  判断单个变量或值的类型
  由于数组和指针复杂性,很多初学者感到无所适从,面对一大堆的东西,不知道到底结果是什么。当然了,首先要知道它的类型。

  最简单、实用的方法:利用编译器。如果你故意将一个你不知道的东西,赋给一个毫不相干的变量,那么,编译器会绝对忠实地告诉你“XX类型不能转换成XXX类型”,这样,你就知道它的类型了。例如:

  int main ()
  int (*apa[10])[10];
  double tmp;
  tmp = apa[0];
  }
  

  这在Dev-C++4.9.8.0(GCC3.2)中,编译后会报错“cannot convert `int (*)[10]' to `double' in assignment”。这样,你就知道apa[0]的类型是int(*)[10]了^__^

  ............................................................

  第二种方法是利用重载。假设,你知道一个变量只能是某几种类型,那么可以把那几种情况都重载了,于是编译器会自动地选择合适的函数,这样也就区分开了,你就知道它是什么类型了。例如:

  #include <iostream>
  #include <cstdlib>
  using namespace std;

  void type (int) { cout << "int" << endl; }
  void type (int*) { cout << "int*" << endl; }

  int main ()
  {
  int a[10];
  type (a+1);

  system ("Pause");
  return 0;
  }
  

  结果会输出“int*”。这个办法很不错。但是如果发生“意外”,它是意料之外的类型,那么你就没有办法了,编译会出错。这时就可以用第一种方法来查看了。

  ............................................................

  第三种方法是用template(模板)来实现。首先定义一个模板函数,对所有类型都说是“未知”类型,然后,再一个一个特化出可能的类型。

  #include <iostream>
  #include <cstdlib>
  using namespace std;

  template <typename T>
  void type (T) {
  cout << "Unknown" << endl;
  }

  template <>
  void type <int> (int) {
  cout << "int" << endl;
  }

  template <>
  void type <int*> (int*) {
  cout << "int*" << endl;
  }

  int main ()
  {
  int a[10];
  type (*a+1);
  
  system ("Pause");
  return 0;
  }
  

  使用template的好处是,对于意料之外的类型,可以输出“Unknown”来表示,不会编译通不过。而且,使用template可以进一步使用更“华丽”的技巧。

  ............................................................

  另外一种方法是typeinfo,这个我还不太熟悉。只简略说一下吧。

  #include <iostream>
  #include <cstdlib>
  #include <typeinfo>
  using namespace std;

  int main ()
  {
  cout << "char:" << typeid(char).name() << endl;
  cout << "unsigned char:" << typeid(unsigned char).name() << endl;
  cout << "signed char:" << typeid(signed char).name() << endl;
  
  system ("Pause");
  return 0;
  }
  

  你能看到几个字符串,但是你不知道是什么意思。

  比较两种类型
  比较两种类型方法也不少,可以用template和typeinfo。

  用template的话,首先实现直接比较两种类型:

  template <typename T, typename U>
  struct SameType {
  static const bool isSame = false;
  };

  template <typename T>
  struct SameType<T, T> {
  static const bool isSame = true;
  };
  

  使用要用两种类型,象这样:

  int main ()
  {
  cout << "unsigned and unsigned int is: "
  << SameType <unsigned, unsigned int>::isSame << endl;
  cout << "long and int is: "
  << SameType <long, int>::isSame << endl;
  
  system ("Pause");
  return 0;
  }
  

  ............................................................

  第二种可以比较变量或值,用函数封装来实现:

  template <typename T, typename U>
  struct SameType {
  static const bool isSame = false;
  };

  template <typename T>
  struct SameType<T, T> {
  static const bool isSame = true;
  };

  template <typename T, typename U>
  bool isSameType (T, U) {
  return SameType <T, U>::isSame;
  }
  

  使用时可以用两个变量,象这样:

  int main ()
  {
  int a, b;
  long c;
  cout << "int a and int b:" << isSameType (a, b) << endl;
  cout << "long c and int a:" << isSameType (c, a) << endl;
  
  system ("Pause");
  return 0;
  }
  

  ............................................................

  用typeinfo实现:

  template <typename T, typename U>
  bool isSameType (T t, U u) {
  return typeid(t) == typeid(u);
  }
  

  使用时象这样:

  int main ()
  {
  int a, b;
  long c;
  cout << "int a and int b:" << isSameType (a, b) << endl;
  cout << "long c and int a:" << isSameType (c, a) << endl;
  
  system ("Pause");
  return 0;
  }

热心网友 时间:2024-10-31 12:29

比较类型?能说清楚点不?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
门?049期父母欲其改娶五字金口决,开是什么特号生肖 支付宝怎么把银行卡的钱转到余额里呢? 下载wampserver5,安装并启动后不能启用apache、mysql的功能,请问这是怎... wampserver安装多个版本phpmysqlapache 四季豆有哪些吃法值得推荐? 四季豆牛肉馅饼的家常做法是什么? 香煎四季豆豆腐饼怎么做好吃 腾讯会议没声音怎么修复-腾讯会议没有声音修复办法 西安市高新区所有幼儿园 西安高新第二初级中学学区有哪些小区 java String类型比较 玫瑰做菜 有什么好的方法~@! 玫瑰菜怎样做夹馍酱 玫瑰花怎么炒菜 玫瑰咸菜的做法步骤图,玫瑰咸菜怎么做好吃 云南大学推出30多道玫瑰花的菜肴,用玫瑰花能做哪些菜? 玫瑰咸菜是什么菜 玫瑰酱菜的腌制方法? 玫瑰白菜的做法 玫瑰花怎么做菜?怎么烹饪口感好? 玫瑰咸菜怎么做如何做好吃 你知道玫瑰菜怎么做吗 摩托罗拉RAZR用起感觉怎么样,性能好不好? 摩托罗拉XT910 MAXX(RAZR MAXX)这款手机现在还能买到吗? 摩托罗拉出的最后一款手机是什么 摩托罗拉 RAZR V8 2GB现在水货价? 求摩托罗拉RAZR V8 2GB 的手机在烟台的价格 摩托罗拉 RAZR2 V8现在买要多少钱 摩托罗拉RAZR V8 2GB与摩托罗拉RAZR V8 那个更值得买 摩托罗拉Droid RAZR上市时间和价格? c语言中double类型值的大小比较 在java的程序里date类型怎么比较大小呀? 两个Long类型怎么比较大小啊? 东北振兴概念股,最新东北振兴板块概念股票有哪些 Java中如何比较两种数据类型为同一种类型? 十二五国家振兴的股票板块有都哪些 怎样比较两个类型为String的字符串 红米k30怎么删除手机备份? C语言中不同类型数据之间的比较? 关于java String类型比较的问题 红米手机自动同步在哪里关掉没找到? 老年人的LD乚应控制在什么水夲 共同富裕下未来什么板块更有机会 红米k305g怎么删掉同步联系人的记录? 在Java中,如何比较两种数据类型是否属于同一种数据类型? 就是我的苹果手机,被前男友拿设置ld,现分手了,他能控制我的手机吗 红米新机怎么关闭自动同步啊,求解 php比较运算符怎么用来比较不同的类型 请问预置数控制端是Ld 可以看做是什么单词的缩写? 股票的地域板块分类都有几种?该如何细分?