член структуры к указателю на саму структуру. При этом я бы хотел работать с произвольным типом T, не требуя от него standard layout.
template <class T>
struct S {
T t;
int foo; // other fields are standard layout
static S* get_struct(T*);
};
Будет ли работать подход заключающийся в использовании буфера char для хранения T?
template <class T>
struct S {
alignas(T) char t[sizeof(T)];
int foo; // other fields are standard layout
static S* get_struct(T* t) {
return reinterpret_cast<S*>(t);
}
};
Нужно ли в данном случае делать два каста T* -> char* -> S*?
Не знаю как я это упустил, но это решается банальным наследованием S от T без всяких извращений.
так вроде очевидно было что ты эмулируешь наследование. но например S в твоей модели был standard layout, а с наследованием не будет (поскольку поля объявляются и в S и в T): Has all non-static data members and bit-fields declared in the same class (either all in the derived or all in some base)
Ну если только T не value type.
Мне нужно добавить метаинформацию к инстансу и получать ее через указатель на оригинальный инстанс. Без дополнительных аллокаций.
в смысле на базовый класс?
Да, хорошее замечание.
Метаинформацией в оригинальном примере был foo, типом к которому добавляется информация - T.
Чот вспомнились boost member hooks, там ещё интереснее извращения, извлечение offsetof из pointer to member: https://github.com/boostorg/intrusive/blob/c03b16b269e89db178223bfe35c5ea2084e12c96/include/boost/intrusive/detail/parent_from_member.hpp
Обсуждают сегодня