访问类成员

时间:2012-10-21 14:02:52

标签: c++ templates c++11

如何访问非静态类成员?

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?
};

1 个答案:

答案 0 :(得分:2)

由于多种原因,你无法做什么是不可能的。

首先,static_assert要求它的参数是编译时常量表达式。 value_绝对不是。

您可以通过标记constexpr来尝试使其成为常量表达式。但是C ++ 11不允许constexpr用于非静态数据成员。即使它确实如此,这也无济于事,因为value_是非静态成员。因此,它还不存在。它仅在存在实际的类实例时才存在,该实例具有this指针。您的static_assert表达式不会创建其中一个对象,因此无法访问它。

因此,为了使这个“工作”(在“工作”做一些有意义的事情的程度),你必须:

  1. 授予A constexpr构造函数,以便您可以创建constexpr实例化。
  2. 您的static_assert必须使用constexpr构造函数实际创建类型并访问相关数据成员。
  3. 现在,如果你这样做,你会发现它没有给你你想要的东西(基于这个陈述,因为你的问题没有解释它究竟是什么你想要完成):

      

    其次,每次我的意思是每次创建这个类的对象,并且X是一个模板参数,它是一个常量表达式。

    请注意static_assert 静态。而“每次创建此类的对象时”都是运行时事件。您无法对运行时发生的事情执行静态测试

    你想要的是常规 assert,而不是static_assert