如何访问非静态类成员?
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?
};
答案 0 :(得分:2)
由于多种原因,你无法做什么是不可能的。
首先,static_assert
要求它的参数是编译时常量表达式。 value_
绝对不是。
您可以通过标记constexpr
来尝试使其成为常量表达式。但是C ++ 11不允许constexpr
用于非静态数据成员。即使它确实如此,这也无济于事,因为value_
是非静态成员。因此,它还不存在。它仅在存在实际的类实例时才存在,该实例具有this
指针。您的static_assert
表达式不会创建其中一个对象,因此无法访问它。
因此,为了使这个“工作”(在“工作”做一些有意义的事情的程度),你必须:
A
constexpr
构造函数,以便您可以创建constexpr
实例化。static_assert
必须使用constexpr
构造函数实际创建类型并访问相关数据成员。现在,如果你这样做,你会发现它没有给你你想要的东西(基于这个陈述,因为你的问题没有解释它究竟是什么你想要完成):
其次,每次我的意思是每次创建这个类的对象,并且X是一个模板参数,它是一个常量表达式。
请注意static_assert
静态。而“每次创建此类的对象时”都是运行时事件。您无法对运行时发生的事情执行静态测试。
你想要的是常规 assert
,而不是static_assert
。