【发布时间】:2019-10-04 16:02:49
【问题描述】:
假设我有一个包含两个数组成员的类,它们的元素类型相同但大小不同:
struct X
{
string a[2];
string b[3];
};
constexpr auto array_members = std::array{ &X::a, &X::b };
这不会编译,因为两个数组(具有不同的长度)具有不兼容的类型。
是否有一个共同的类型可以同时分配两个成员指针?
我也尝试过static_cast<string (X::*)[]>(&X::a),但由于数组类型不完整,这也无法编译。
我不能使用offsetof,因为它需要与非标准布局类一起使用。
这可能是一种解决方法:
using array_type = decltype(X::b);
auto const array_members = std::array{
reinterpret_cast<array_type X::*>(&X::a), // cannot be constexpr
&X::b
};
但我担心调用未定义的行为。尽管我确信在运行时没有越界元素引用,但我们确实创建了指向 a 的过去的指针,鉴于 b 的类型似乎是在界内.我不确定这是否违反规范。如果我可以使用与reinterpret_cast 不兼容的constexpr 也会很方便。
【问题讨论】:
-
是的,它叫做联合。
-
std::vector可让您绕过所有这些,因为大小不是类型的一部分。 -
@NathanOliver 这会丢失成员的编译时大小信息。
-
可以选择用
std::tuple替换std::array。
标签: c++ arrays c++17 pointer-to-member