我的问题是我不知道如何检查对象是否为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;
}
答案 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;
}