Предположим, у меня есть класс с двумя элементами-массивами одного и того же типа элемента, но разных размеров:
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
выглядит как ограниченное. ,Я не уверен, идет ли это вразрез со спецификацией. Также было бы удобно, если бы я мог использовать constexpr
, который несовместим с reinterpret_cast
.