c++ - 使用负数组索引访问前一个成员
问题描述
我想使用负数组索引来访问结构中紧接在该数组之前的相同类型成员。
考虑这种类型的代码:
union hello {
int a[2];
struct { int b0; int b1[1]; };
};
我想用来b1[-1]
访问b0
.
当我尝试这样做时,clang 和 gcc 似乎完全理解我想要什么。
extern const int test = hello{{42, 1337}}.b1[-1];
这在编译时正确地确定test
了42
.
-1
不幸的是,clang 会产生一个不受约束的警告。const
如果我更改为.gcc 也会这样做constexpr
。
编写此类代码的正确方法是什么?
以下是我已经知道但不喜欢的方式:
a[]
与基于 1 的索引一起使用。- 制作
b1
一个指向 的指针a[1]
。
解决方案
当我尝试这样做时,clang 和 gcc 似乎完全明白我想要什么
是的,但如果被问到(gcc),它们也会产生一些诊断:
prog.cc:6:33:警告:ISO C++ 禁止匿名结构 [-Wpedantic] 结构{int b0; 诠释 b1[1]; };
此外,访问b1
不是联合的活动成员(a
是初始化的成员)是未定义的行为。
您可以改为编写一个封装数据和所需访问逻辑的类:
#include <iostream>
#include <array>
template<size_t Dim>
class Hello
{
std::array<int, Dim> data_;
public:
template<class... ArgType>
constexpr Hello(ArgType... args) : data_{args...} {};
constexpr int first() const noexcept { return data_[0]; }
constexpr int one_based(int i) const { return data_.at(i + 1); }
constexpr int zero_based(int i) const { return data_.at(i); }
};
int main()
{
constexpr Hello<2> hi {42, 1337};
static_assert(hi.first() == 42);
static_assert(hi.one_based(-1) == 42);
static_assert(hi.one_based(0) == 1337);
static_assert(hi.zero_based(0) == 42);
static_assert(hi.zero_based(1) == 1337);
std::cout << "So far, so good...\n";
}
推荐阅读
- node.js - nodejs 6.1.0 安装错误 - node-pre-gyp
- android - 为什么 RecyclerView 项中的 ConstraintLayout 比 LinearLayout 慢?
- sql - 如何更好地优化 SQL 查询?
- java - 将方法应用于流
- javascript - JS 在后台运行时隐藏元素然后再次显示
- javascript - 根据单击的鼠标位置定位 div
- html - 如何解决我的css文件中的多步骤问题?
- php - PHP在特定单词后切片多维数组而不破坏原始结构
- javascript - 在滚动间隔上显示或隐藏图像
- node.js - 将情报从 LUIS 转移到 QnA