c++ - 访问类成员

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

最佳答案

由于多种原因,您的具体操作是不可能的。

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

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

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

  1. A 一个 constexpr 构造函数,这样你就可以创建它的 constexpr 实例。
  2. 您的 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/

相关文章:

c++ - 具有在参数中返回指针的函数的智能指针

c++ - 命名空间中模板运算符的重载解析

jquery - 对当前 jQuery 模板解决方案有何建议?

c++ - 什么时候隐式 move 构造函数不够好?

c++ - 使用 C++ 和 Qt 5 播放声音文件

templates - 在 Word 2013 中添加自定义 "template group"

WPF : Define binding's default

c++ - 如何访问 vector 的元素,其中 vector 在 unordered_map 中映射为字符 'key'?

gcc 的 C++ 部分模板特化问题

c++ - C/C++ 如何将宏参数扩展为引号之间的文本