C++ マクロoffsetof
は、標準のレイアウト タイプで使用する場合の動作を定義しただけです。私が理解したように、これはコンパイラが実行するコードのコンテキストに応じてデータのメモリ レイアウトを変更できるためです。(たとえば、変数がまったく使用されない場合)
しかし、私が疑問に思ったのは、範囲に格納されたすべての要素が同じレイアウトを共有するかどうかということです。または、言い換えれば、次のコードが適切に定義されている場合:
template<typename T>
concept has_member_int = requires(const T& x)
{
{ x.member } -> std::same_as<int>;
};
template <std::ranges::Range Range_t, has_member_int T>
void setEveryMemberTo20(Range_t<T> range)
{
if (range.size() > 0)
{
auto& firstElement = *(range.begin());
auto ptrdiffToMember = &(firstElement.member) - &firstElement;
for (auto& element : range)
{
*(reinterpret_cast<int*>(&element + ptrdiffToMember)) = 20;
}
}
}