如何检查对象是否为常量?

时间:2014-06-04 03:42:33

标签: c++

我的问题是我不知道如何检查对象是否为const。我只能使用C ++ 98。如何检查对象是否具有const修饰符?如何正确地过载函数?

int main(){
  Vec x;
  const Vec y;

  cout<<"Is x const? ";
  y.IfConst(x);     // cout << "no"
  cout<<"\n";

  cout<<"Is x const? ";
  x.IfConst(x)      // cout << "no"
  cout<<"\n";

  cout<<"Is y const? ";
  x.IfConst(y);     // cout << "yes"
  cout<<"\n";

  cout<<"Is y const? ";
  y.IfConst(y);     // cout << "yes"
  cout<<"\n";
  /**/
}

我需要输出看起来像: 是x const?没有 是x const?没有 是y const?是 是y const?是

我用过:

void Vec::IsConst(Vec const &vecc) const{
  std::cout << "YES" << std::endl;      
}

void Vec::IsConst(Vec const &vecc) {
  std::cout << "NO" << std::endl;       
}

4 个答案:

答案 0 :(得分:10)

constness是已知的,仅用作编译时,信息在运行时不存在,没有任何意义。

但是,在编译时,如果您有一个符合C ++ 11的编译器,则可以在类型上使用标准std::is_const type trait

int main() 
{
    std::cout << std::boolalpha;
    std::cout << std::is_const<const int>::value << '\n';
    std::cout << std::is_const<Vec>::value  << '\n';
}

如果您没有c ++ 11编译器,可以使用boost一个。

答案 1 :(得分:2)

您提出的语法对我没有意义。

这适合我。

#include <iostream>

template <typename T> bool isConst(T& x)
{
   return false;
}

template <typename T> bool isConst(T const& x)
{
   return true;
}

int main() 
{
   int x;
   const double y = 0.0;

   std::cout << "Is x const? ";
   std::cout << isConst(x) << "\n";

   std::cout << "Is y const? ";
   std::cout << isConst(y) << "\n";
}

输出:

Is x const? 0
Is y const? 1

答案 2 :(得分:1)

您不需要在运行时检查这一点。由于编译器会在代码中尝试修改const对象时抛出错误。

另一方面,如果你决定做一些类型转换/指针魔术来强制修改const对象,那么就无法检测到它。

无法检测的主要原因是,与python和java等解释语言不同(如果你认为JVM是一个解释器),C ++并没有提供很多内省功能。结构和类只是将其数据布局映射为内存中的块,而不附加其他元数据。这使得C / C ++成为具有更高效率和更少内省的中级语言。

答案 3 :(得分:1)

要解决我的问题,我需要重载功能

void Vec(Vec const &Vecc) const{
std::cout << "YES" << std::endl;            
}

void Vec(Vec const&Vecc){                        
std::cout << "YES" << std::endl;            
}

void Vec(Vec &Vecc) const {
std::cout << "NO" << std::endl;     
}

void Vec(Vec &Vecc) {
std::cout << "NO" << std::endl;     
}