常量静态成员函数:有另一种方法可用吗?
Const static member functions: is another approach available?
如本问答中所报告的那样,常量静态成员函数在C++中不可用。从那以后(2011年(有什么变化吗?
有没有另一种方法可以让静态成员函数不修改其类的静态成员?
类似的东西(伪代码(:
class C
{
static int a;
public:
static void Incr() { ++a; }
static int Ret() const { return a; }
};
int C::a = 0;
我需要从另一个类的 const 成员函数调用 [const] 静态成员函数。
根据当前 cppreference.com(关于静态成员的页面(,静态成员函数仍然不能是 const,因为 const 关键字只修改了this
指针,而静态函数显然没有。
因此,自从您所指的答案被写出来以来,似乎没有任何变化。
从那以后(2011年(有什么变化吗?
没有任何变化,您仍然无法对静态成员函数进行 cv 限定。
有没有另一种方法可以让静态成员函数不修改其类的静态成员?
不是一个完美的解决方案,但你可以向静态数据成员声明 const "alias":
static int Ret() {
static constexpr const auto& a = C::a;
// Now C::a is shadowed by the local a
// and the function can't modify it.
// a = 2; // ill-formed
return a * 2; // OK
}
它仍然需要纪律,但至少这样编译器可以捕获意外的修改尝试。
只有静态字段和静态方法的类不值得被称为类。它只是函数和全局变量的形式,具有花哨的名称间距。
无论如何,IMO 最好有一个带有常规字段和方法的常规类,然后将其实例化为全局变量(不是很好的解决方案,但至少在类仅包含静态字段和方法的情况下更诚实(。
class C
{
int a;
public:
C() : a(0) {}
void Incr() { ++a; }
int Ret() const { return a; }
};
C instance;
或者使用我讨厌的单例模式。
从生成的代码的角度来看,应该没有区别。
相关文章:
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 如何在一种方法中创建对象并在另一种方法中使用它
- 常量静态成员函数:有另一种方法可用吗?
- 如何将程序从主发送到另一种方法
- 如何使用shared_ptr或推荐另一种方法(unique_ptr)
- 在C++编程中继续下一行的另一种方法是什么?
- 是否有另一种方法可以在不使用宏定义的情况下进行此操作
- 将带有参数的void方法传递给使用std ::函数和std :: bind c 的另一种方法
- C++:访问由另一种方法返回的向量的常量向量时出现分段错误
- 一个人如何将腋窝VEC/MAT作为REF论点传递给另一种方法
- 从另一种基本方法调用Overriden方法
- Visual Studio 2003使用regex的另一种方法
- C++另一种方法计算平均值
- 在cuda中使用静态成员函数模板结构的另一种方法
- 另一种创建随机数的方法
- C++-使用循环的另一种方法
- 在C++03中初始化成员的另一种方法
- 获取十六进制字符串的字节长度的另一种方法
- 如何让一些派生类使用相同的方法,而另一些派生类则使用另一种方法
- 除以2的另一种方法是什么?