如何访问非静态类成员?
class A
{
int value_ = 0;//I want to access this member in class inheriting from A
};
template<class X = A>
class Y :X
{
static_assert(value_ == 0,"Non-zero not allowed");//here I want to access value_ from X which is A by default. Is this possible?
};
最佳答案
由于多种原因,您的具体操作是不可能的。
首先,static_assert
要求它的参数是编译时常量表达式。 value_
肯定不是。
您可以尝试通过将其标记为 constexpr
使其成为常量表达式。但是 C++11 不允许 constexpr
用于非静态数据成员。即使它这样做了,也无济于事,因为 value_
是一个非静态成员。因此,它还不存在。它仅在存在实际类实例时存在,即具有 this
指针的实例。您的 static_assert
表达式不会创建这些对象之一,因此无法访问它。
因此,为了使这个“工作”(在“工作”做一些有意义的事情的范围内),你必须:
- 给
A
一个constexpr
构造函数,这样你就可以创建它的constexpr
实例。 - 您的
static_assert
必须使用constexpr
构造函数实际创建一个类型并访问相关数据成员。
现在,如果你这样做,你会发现它不会给你你想要的(基于这个陈述,因为你的问题没有解释它到底是什么你正在努力完成):
Secondly, by every time I meant every time object of this class is created, and as a X is a template param it is a constant expression.
请注意,static_assert
是静态的。而“每次创建此类的对象”都是一个运行时事件。您不能对运行时发生的事情执行静态测试。
您想要的是常规 assert
,而不是static_assert
。
关于c++ - 访问类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12998506/